“云小霄,你的神经中枢是不是有问题。”
在第一百二十八次看到云小霄在没有任何外物的情况下趴在榻榻米上,像一个蛆一样的扭动的时候,李小庚终于忍不住开口了。
“没大没小的,你才有问题!你全家都有问题!”云小霄随手捡起榻榻米上的零食砸向李小庚,然后继续发出阵阵傻笑。
“那你怎么现在扭的像个蛆一样?以前每天趴在地上拿着平板打游戏也就算了,这段时间天天看你对着空气傻笑,是不是脑子坏掉了?”
“呸!你才脑子坏掉了,怎么来万法仙门两年了还这么纯纯的?有空记得看看新闻,万维仙网这段时间新推出了云游戏云电影模式,只需要达成连接,就可以通过云服务直接访问网络服务哦,甚至连客户端都不需要了。”云小霄看白痴一样看着李小庚。
李小庚一脸哀怨的望着云小霄:“你不是说结丹之前不让我上网吗,别的师兄师弟天天在网上打游戏聊天,只有我连领个文具都得线下排队。”
“我还不是为了你好?”云小霄双手叉腰:“行吧行吧,反正你的基础也打得差不多了,今天我就教你今法修士的必修课--网络编程。”
一、socket和TCP/IP协议
1、1什么是socket
学习网络编程,我们首先就是要理解计算机之间是如何进行通信。 socket是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 要理解socket,就需要理解TCP/IP协议,两者之间的关系,就如同驿站和和驰道一般。
1、2TCP/IP协议
OSI模型:
目前实际使用的网络模型是 TCP/IP 模型,它对 OSI 模型进行了简化。它把所有的TCP/IP系列协议归类到四个抽象层中 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:IP,ICMP,OSPF,EIGRP,IGMP 数据链路层:SLIP,CSLIP,PPP,MTU 每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的
1、3socket原理
我们平常使用网络传输信息,是将程序产生的数据一层层地往下传输,最后传输到互联网中。数据每向下一层,就会通过这一层的协议进行包装,等程序发送到网上,已经像俄罗斯套娃一般多了四层包装。 而其他的用户接收数据包的时候,也会从网络结构层一层一层的向上传输,同时也一层一层地拆开包装,最后回到应用层,就得到了程序锁需要的数据。 给数据加包装的过程,实际上就是在数据的头部增加一个标志(一个数据块),表示数据经过了这一层,我已经处理过了。给数据拆包装的过程正好相反,就是去掉数据头部的标志,让它逐渐现出原形。 两台计算机进行通信时,必须遵守以下原则:
- 必须是同一层次进行通信,比如,A计算机的应用层和B计算机的传输层就不能通信,因为它们不在一个层次,数据的拆包会遇到问题。
- 每一层的功能都必须相同,也就是拥有完全相同的网络模型。如果网络模型都不同,那不就乱套了,谁都不认识谁。
- 数据只能逐层传输,不能跃层。
- 每一层可以使用下层提供的服务,并向上层提供服务。
我们所说的Socket在应用层与传输层之间,传输层将底层的服务提供给socket抽象层,socket抽象层再提供给应用层,通过这个办法来进行数据传递。
“师父,这么多层级协议我们都要掌握吗?”李小庚头皮有点麻,上个网原来这么麻烦吗?
“大多数时候你的确不需要明白。但是有的时候,当你在实战中遇到由于TCP算法引起的bug时,懂点相关知识就变得非常重要了。”
“明白了。”
“那好,我继续给你讲讲网络连接的过程。”
二、TCP/IP结构与三次握手、四次挥手
2、1TCP数据报结构:
- 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
- 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq 1。
- 标志位:每个标志位占用1Bit,共有6个,分别为URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
- URG:紧急指针(urgent pointer)有效。
- ACK:确认序号有效。
- PSH:接收方应该尽快将这个报文交给应用层。
- RST:重置连接。
- SYN:建立一个新连接。
- FIN:断开一个连接。
2、2连接的建立(三次握手)
使用 connect() 建立连接时,客户端和服务器端会相互发送三个数据包
客户端调用socket() 函数创建套接字后,因为没有建立连接,所以套接字处于CLOSED状态;服务器端调用 listen()函数后,套接字进入LISTEN状态,开始监听客户端请求。 这个时候,客户端开始发起请求:
- 当客户端调用 connect() 函数后,TCP协议会组建一个数据包,并设置 SYN 标志位,表示该数据包是用来建立同步连接的。同时生成一个随机数字 1000,填充“序号(Seq)”字段,表示该数据包的序号。完成这些工作,开始向服务器端发送数据包,客户端就进入了SYN-SEND状态。
- 服务器端收到数据包,检测到已经设置了 SYN 标志位,就知道这是客户端发来的建立连接的“请求包”。服务器端也会组建一个数据包,并设置 SYN 和 ACK 标志位,SYN 表示该数据包用来建立连接,ACK 用来确认收到了刚才客户端发送的数据包。 服务器生成一个随机数 2000,填充“序号(Seq)”字段。2000 和客户端数据包没有关系。 服务器将客户端数据包序号1000 1,得到1001,并用这个数字填充“确认号(Ack)”字段。 服务器将数据包发出,进入SYN-RECV状态。
- 客户端收到数据包,检测到已经设置了 SYN 和 ACK 标志位,就知道这是服务器发来的“确认包”。客户端会检测“确认号(Ack)”字段,看它的值是否为 1000 1,如果是就说明连接建立成功。 接下来,客户端会继续组建数据包,并设置 ACK标志位,表示客户端正确接收了服务器发来的“确认包”。同时,将刚才服务器发来的数据包 序号2000 1,得到 2001,并用这个数字来填充“确认号(Ack)”字段。 客户端将数据包发出,进入ESTABLISED状态,表示连接已经成功建立。
- 服务器端收到数据包,检测到已经设置了 ACK 标志位,就知道这是客户端发来的“确认包”。服务器会检测“确认号(Ack)”字段,看它的值是否为 2000 1,如果是就说明连接建立成功,服务器进入ESTABLISED状态。 至此,客户端和服务器都进入了ESTABLISED状态,连接建立成功,接下来就可以收发数据了。
三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号 Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq 1是否成立,如果成立说明对方正确收到了自己的数据包。
2、3连接的断开(四次挥手)
建立连接后,客户端和服务器都处于ESTABLISED状态。这时,客户端发起断开连接的请求:
- 客户端调用close() 函数后,向服务器发送 FIN 数据包,进入FIN_WAIT_1状态。FIN 是 Finish 的缩写,表示完成任务需要断开连接。
- 服务器收到数据包后,检测到设置了 FIN 标志位,知道要断开连接,于是向客户端发送“确认包”,进入CLOSE_WAIT状态。
注意:服务器收到请求后并不是立即断开连接,而是先向客户端发送“确认包”,告诉它我知道了,我需要准备一下才能断开连接。
- 客户端收到“确认包”后进入FIN_WAIT_2状态,等待服务器准备完毕后再次发送数据包
- 等待片刻后,服务器准备完毕,可以断开连接,于是再主动向客户端发送 FIN 包,告诉它我准备好了,断开连接吧。然后进入LAST_ACK状态。
- 客户端收到服务器的 FIN 包后,再向服务器发送 ACK 包,告诉它你断开连接吧。然后进入TIME_WAIT状态。
- 服务器收到客户端的 ACK 包后,就断开连接,关闭套接字,进入CLOSED状态。
客户端最后一次发送 ACK包后进入 TIME_WAIT 状态,而不是直接进入 CLOSED 状态关闭连接,这是为什么呢? TCP 是面向连接的传输方式,必须保证数据能够正确到达目标机器,不能丢失或出错,而网络是不稳定的,随时可能会毁坏数据,所以机器A每次向机器B发送数据包后,都要求机器B”确认“,回传ACK包,告诉机器A我收到了,这样机器A才能知道数据传送成功了。如果机器B没有回传ACK包,机器A会重新发送,直到机器B回传ACK包。 客户端最后一次向服务器回传ACK包时,有可能会因为网络问题导致服务器收不到,服务器会再次发送 FIN 包,如果这时客户端完全关闭了连接,那么服务器无论如何也收不到ACK包了,所以客户端需要等待片刻、确认对方收到ACK包后才能进入CLOSED状态。
“怎么样,要不是试着接触一下不一样的世界?”云小霄的声音,就像是古神的低语一般,不断地刺激着李小庚的神经。穿越前作为一个宅男,李小庚又如何不想连上这个听起来就是完全体元宇宙的东西呢?
李小庚深吸了一口气,按照云小霄的指引,缓慢的运转法力在体内构建出TCP/IP系列的四层架构并且尝试与已经被拓印在整个世界之上的万维仙网进行握手。在万维仙网创建之初,万法仙门的历代先贤就已经将架构的具体参数记录在了《Java真经》内,所以李小庚很顺利的就连接成功。
“万维仙网主要分为两部分,供给给所有人的万维网,与每个宗门、个人自己搭建的内网,此外还有游离在两者之间的暗网。目前你还没有缴网费,所以还无法连接到万维网,不过我们万法仙门的内网也不差,还有绿坝娘的守护,就算你这种小白也不会因为浏览不良网页而受到邪修的侵害”说道不良网页的时候,云小霄突然嘿嘿嘿的笑了起来,一看就是长期从事鉴别工作的大能。
“师父,那我也可以在万维仙网建立自己的空间吗?”
“当然,你可以用自己的云中洞天作为服务器搭建网站,不过嘛,这样的私人网站是不被万维仙网认可的。”
“那怎么样才能被认可呢?”
云小霄狡黠的笑了笑,右手做了一个搓手指的动作:“你懂得,当然是交钱啦!你要找万维仙网的各大理事宗门交一笔赞助费,然后就能获得唯一的SSL证书认证,这个时候,你的网站就是一个安全的网站了。”
三、HTTPS和HTTP
3、1介绍
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。 安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。 HTTPS协议是由SSL/TLS HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。 HTTPS协议的主要作用可以分为两种:
- 一种是建立一个信息安全通道,来保证数据传输的安全;
- 另一种就是确认网站的真实性。
3、2HTTPS和HTTP的主要区别
- 1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
- 2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
- 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- 4、http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
3、3HTTP方式与Web服务器通信
第一步:建立TCP/IP连接,客户端与服务器通过Socket三次握手进行连接 第二步:客户端向服务端发起HTTP请求(例如:POST/login.html http/1.1) 第三步:客户端发送请求头信息,请求内容,最后会发送一空白行,表示客户端请求完毕 第四步:服务器做出应答,表示对于客户端请求的应答,例如:HTTP/1.1 200 OK 第五步:服务器向客户端发送应答头信息 第六步:服务器向客户端发送请求头信息后,也会发送一空白行,表示应答头信息发送完毕,接着就以Content-type要求的数据格式发送数据给客户端 第七步:服务端关闭TCP连接,如果服务器或者客户端增Connection:keep-alive就表示客户端与服务器端继续保存连接,在下次请求时可以继续使用这次的连接
3、4HTTPS方式与Web服务器通信
第一步:客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。 第二步:Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。 第三步:客户端的浏览器与Web服务器开始协商SSL/TLS连接的安全等级,也就是信息加密的等级。 第四步:客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。 第五步:Web服务器利用自己的私钥解密出会话密钥。 第六步:Web服务器利用会话密钥加密与客户端之间的通信。
四、TCP与UDP
讲了HTTP和HTTPS,顺便再和大家一起回忆一下TCP与UDP。 TCP 是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复 ACK 包确认,多种机制保证了数据能够正确到达,不会丢失或出错。 UDP 是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单地把数据丢到网络中,也不需要 ACK 包确认。 如果只考虑可靠性,TCP 的确比 UDP 好。 但 UDP 在结构上比 TCP 更加简洁,不会发送 ACK 的应答消息,也不会给数据包分配 Seq 序号,所以 UDP 的传输效率有时会比 TCP 高出很多,编程中实现 UDP 也比 TCP 简单。 UDP 的可靠性虽然比不上TCP,但也不会像想象中那么频繁地发生数据损毁,在更加重视传输效率而非可靠性的情况下,UDP 是一种很好的选择。比如视频通信或音频通信,就非常适合采用 UDP 协议。通信时数据必须高效传输才不会产生“卡顿”现象,用户体验才更加流畅,如果丢失几个数据包,视频画面可能会出现“雪花”,音频可能会夹带一些杂音,这些都是无妨的。 与 UDP 相比,TCP 的生命在于流控制,这保证了数据传输的正确性。 TCP 的速度无法超越 UDP,但在收发某些类型的数据时有可能接近 UDP。例如,每次交换的数据量越大,TCP 的传输速率就越接近于 UDP。
暂时没有建立网站打算的李小庚随着云小霄一起进入了万维仙网,在连入的一瞬间,眼前仿佛同时有两个世界一样,意识也仿佛一分为二,且并没有任何不适感。
“同时身处两个世界的感觉是不是很神奇?”云小霄拍了拍李小庚的肩膀,感叹道:“如果有一天你也到了那个境界,或许能创造出更神奇的东西吧,今法与古修最大的区别就是,今法所做的一切都是为了看到更多的风景,所以大家会联合起来,虽然偶有争斗,但是目标却是一致的。而古修们则全是为了飞升不择手段之人,他们虽然也有像我们一样的宗门、师徒的关系纽带,但是个人利益却高于一切。”
“那么现在世界上还有古修吗?现如今不都是修习今法之人吗?”
“古修之古不在于功法,而在于内心。”