网络之间需要传输信息,那么各个计算机设备应该怎样传输信息,这就是网络协议定义的内容了。对于这个标准制定,主要有两个协议:TCP/IP模型和OSI模型。注意TCP/IP是现在网络设备已大量使用的协议,而OSI是个参考模型!且TCP/IP先被提出使用,OSI是后续提出来的。
主要分为七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层,它们的作用以及使用的实际协议如下:
该模型主要分4层:应用层、传输层、网络层、网络接口层。
应用层:定义了应用程序的网络传输协议。比如HTTP、FTP、SSL、POP3、SMTP协议。一般该协议是应用程序实现,广大应用开发者一般也是只能在这一层定义新协议或修改协议。
传输层:建立端到端的连接。主要有:TCP或UDP协议。
网络层:寻址和路由选择。主要有:IP协议(IPv4、IPv6)、ICMP、ARP等协议。
网络接口层:定义物理介质访问以及比特传输,主要有:Ethernet、IEEE 802.2协议。
这里的TCP指的是传输层的TCP,所有基于它传输的协议都要经过三次握手,比如HTTP协议。浏览器组装好http协议的数据后,发送给服务端,服务端会和浏览器先进行三次握手,浏览器才会把http数据发送给服务器。
具体握手过程如下:
说明:ACK为确认,SYN为同步序号,seq为随机数。
规定:SYN=1,ACK=0表示申请连接,SYN=1,ACK=1表示同意连接
第一次握手:客户端发送SYN和ACK等报文向服务器申请连接,这里发了随机数看服务器是否能正确应答。
第二次握手:服务器发送同意连接,并给出应答,并发出自己的随机数看客户端能否正确应答。
第三次握手:客户端发出同意连接并给出正确的应答。
之所以要第三次握手,原因有以下两点:
1、因为TCP是双向传输的,两次握手能让客户端确定服务器能收到它发的消息,但无法让服务器确定客户端能否收到它发的消息。
就好比我们通话:
张三:你能听到我说话吗?
李四:我能听到,你能听到我说话吗?
张三:我能听到。
假如最后一步没了,那么李四(服务器)无法确定张三能否收到他发出的信息!
2、避免失效的请求重新将客户端和服务器连接。
比如客户端发起第一次请求,由于网络或CPU时间片原因,请求被滞留,客户端等待超时又向服务器发送请求,这次请求成功并双方建立连接发送数据,之后业务完成关闭连接。而此时第一次的连接请求又好了,发送给服务器,服务器响应了后就直接与客户端建立连接了!若有第三次握手,服务器还会等待客户端应答的,客户端此时是关闭状态显然不会去应答,所以第三次握手能避免这种无效连接的建立。
TCP是全双工,因此客户端和服务器都要把数据发完,然后确认关闭。这里的挥手,客户端和服务器都可以先发起,它们挥手的状态是互通的。
具体挥手过程如下:
第一次挥手:服务端发送FIN=1,seq=x以及最后的数据给客户端。
第二次挥手:客户端收到FIN标识后,知道另一端要关闭了,便发送ACK=1,seq=y,ack=x+1以及最后的数据给服务端。
第三次挥手:客户端发送完数据后边发送FIN=1,ACK=1,seq=w,ack=x+1给服务端,告诉服务端这边也要关闭了。
第四次挥手:服务端接收到客户端的FIN后,边发送ACK=1,seq=x+1,ack=w+1给客户端。客户端收到消息后直接关闭。而服务端等待设定时长后关闭。
注意,这里的第二次的应答和数据与第三次的结束标识之所以区分开,是有可能发生第三次握手后,第四次的握手因网络等原因没有发送到客户端,因此需要进行第三次挥手再次发送FIN和seq进行确认,所以要把第三次握手单独提取出来。
图中服务端最后的等待2MSL也是防止第四次握手的报文因网络等原因传输失败,导致客户端一直无法收到ACK无法关闭,因此设计了客户端等待第四次握手超时会重发第三次握手。所以服务端要等待2MSL(2分钟)。若真的再有三次握手,则直接再发送第四次握手让客户端关闭。