计算机网络之三次握手与四次挥手

前言

基于TCP连接的应用层协议,比如http协议进行通信时都要事先与目标服务器进行TCP连接,而分析进行连接/释放时的TCP报文段(TCP segment)对理解TCP建立连接/释放连接过程非常重要

1.TCP报文段格式


重点:

1.序列号(sequence number)seq:序列号,用于标识已发送的数据量,初始序列号由系统分配

(假设初始序列号为100,本次TCP报文片段包含100字节数据,那下次序列号为100+100=200,每个TCP片段都必须有序列号,它表明了数据片段之间的顺序性)

2.确认号(acknowledge number)   ack:确认号,用于标识已接受的数据量,表示下次期望受到的数据序列号

(确认号是对数据传输双方而言,由数据接收方(可能是客户端也可能是服务器,指一次对话中的传输与接受方)发送,表示之前接受到的数据均已校验合格,值表示下次应该接受的数据编号,很显然,ack值为上一次接受的TCP片段序列号+1)

3.flags:标志位,为布尔值,标识该TCP片段某个状态有效与否

ACK:标识ack是否有效    SYN:标识是否是新建连接   FIN:标识是否是释放连接

2.三次握手

1.服务器处于listen状态

客户端:SYN + seq(客户端初始序列号,标识客户端数据传输开始,设为X)——>  服务器  

 客户端发送后进入SYN-SENT状态,等待服务器响应。

2.服务器接收到客户端的连接申请,解析报文并记录客户端初始序列号seq(X)

服务器:ACK + ack(X+1)+SYN + seq(服务器初始序列号,标识服务器数据传输开始,设为Y) ——>  客户端

  服务器发送后进入SYN-RCVD状态,等待客户端的确认。

3.客户端接收到服务器的同意连接报文解析并记录服务器初始序列号seq (Y)

客户端:ACK+ack(Y+1)+seq(X+1)   ——>   服务器

 客户端在发送后进入ESTAB-LISHED状态,服务器在收到上述报文后也进入该状态,通讯开始!


3.四次挥手

1.客户端数据传输完成,主动申请关闭连接

客户端:FIN + seq (按客户端已发送的数据量编号,设为C)——> 服务器

客户端发送完申请释放连接报文后,进入FIN-WAIT-1状态,等待服务器的确认。

2.服务器接收到释放连接的申请报文,马上向客户端回应已收到

服务器:ACK + ack(C+1) +seq (按服务器在通讯过程中的数据量编号,设为S)——>客户端

服务器在发送上述报文后,进入CLOSE-WAIT状态,如果还有数据没发送完,加急发送剩余数据(因为是客户端突然提出的释放连接,服务器事先不知道,所以很有可能数据还没有发送完成),客户端在接受到该报文后进入FIN-WAIT-2状态,等待接收最后的数据

3.服务器在发送完所有数据后,向客户端也发送同意结束报文

服务器:FIN+seq(因为在此之前服务器又发送了数据,所以序列号更新,设为F)+ACK+ack(C+1)——> 客户端

服务器在发送完后进入LAST-ACK状态,等待客户端的最后确认

4.客户端在接收到服务器的同意释放报文后,发送最后确认报文,标识已收到同意结束报文

客户端:ACK +seq(C+1)+ ack(F+1)   ——>  服务器

客户端在发送完后,等待2msl后关闭,服务器接收到后直接关闭。msl指报文片段在网络上最大存活时间


4.疑问

1.为什么要进行三次握手而不是两次?


2.为什么要等待2msl才关闭连接?

因为即使客户端发送最后的确认报文后,并不能确定服务器一定会收到,假设服务器没收到,那一定会在1msl之后重新发送同意结束报文,而此报文发送到客户端最长时间也需要1msl,故客户端认为在2msl之内都没有收到服务器的重发报文则认为其已经收到了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。