实战!一次网络问题排查( 三 )


URG:URG=1 代表报文有紧急数据
ACK:ACK = 1,确认位,TCP中连接建立后,所有报文的ACK 位置都为1;
PSH: 发送端和接收端都有缓冲区(发送端:写缓冲区 接收端:读缓冲区) 对于发送端:带PSH=1,报文会立即从缓冲区报文推送给服务端 对于服务端:服务端立即将读缓冲区内容推给进程 。
RST:RST=1,代表连接出现严重错误,TCP连接的一方将连接重置了,必须释放连接,重新建立连接;
SYN:同步SYN,在连接建立时用来同步序号 。三次握手时会用到,当SYN=1,ACK =0,表明是发起方请求建立连接,服务方同意建立连接,响应报文SYN=1,ACK =1,前者表明同步连接,后者是确认报文 。
FIN:用来释放连接 。当FIN =1,表明此报文的发送方的数据已经发送完毕,并且要求释放 。
窗口:占2字节,通常用于告知对方自己的能够接受的数据量大小 。窗口本质就是一个缓冲区buffer,该字段的值用于告知对方自己剩余的可用缓冲区大小 。
校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得 。由发送端计算和存储,并由接收端进行验证 。
紧急指针:只有当 URG 标志置 1 时紧急指针才有效 。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号 。
选项:可选的 。最常见的可选字段是最长报文大小,又称MSS(Maxinum Segment Size), 每个连接方通常在通信的第一个报文段(连接建立的SYN标志位为1的数据报文)设置这个选项,表示本端能接受的最大报文段的长度 。因为长度不一定是32的整数倍,因此要加额外的0作为填充 。
数据部分:可选的 。连接建立和终止时,报文段只有TCP首部 。
我们先回顾一下以前计算机网络课堂上学过的TCP传输的三次握手流程:

实战!一次网络问题排查

文章插图
 
TCP连接三次握手
实战!一次网络问题排查

文章插图
 
三次握手
三次握手的具体过程如下:
服务端进程启动,准备接收客户端进程的连接请求,此时接收方进入LISTEN(监听)模式;
三次握手第一步:客户端向服务端发出连接请求报文,这时报文首部SYN 标志位为1,同时设置一个初始序列号seq = x(随机数); 做完这步动作,发送方进入SYN_SENT (同步已发送状态)。
名称解释:SYN:同步标志位 seq:包序列编号(每个包都有一个序列号)
第一次握手客户端发送的报文称为同步请求报文,希望与服务端建立同步连接,SYN报文不携带数据 。
三次握手第二步:服务端收到来自客户端的连接请求报文后,需要确认收货,响应报文中ACK(确认标志位)设置为1,将确认号ack 设置为第一步的请求序列号seq 加1(ack =x+1),另外自己也回客户端一个SYN包(可以建立同步连接),即SYN + ACK包,包序列号seq = y,服务端进入SYN_RCVD(同步收到)状态 。
名词解释:ACK:确认状态位(这里ACK=1),这个一定和ack(32位确认序号,这里ack=x+1)区分开,可以看下面的TCP 报文结构体图,ACK是包的状态标志,ack是确认序号 。
三次握手第三步:客户端收到来自服务端的 SYN + ACK 包,会发送一个ACK 确认包,ACK =1,seq = x+1( 第二步的ack),ack = y+1(第二步的seq+1) 。
玩家们如果觉得看安琪拉写的有收获,欢迎关注公众号【安琪拉的博客】,来找安琪拉草丛互动!
3.3 四次挥手四次挥手的状态图如下所示:
实战!一次网络问题排查

文章插图
 
四次挥手
四次挥手wireshark 包信息如下,可以对照着上图看,
实战!一次网络问题排查

文章插图
 
Wireshark四次挥手
四次挥手的具体过程如下:
客户端发送FIN 释放连接报文,表示结束连接,报文seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN_WAIT1(终止等待1)状态 。
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE_WAIT(关闭等待)状态 。TCP接收方通知上层的应用进程,客户端向服务器方向的发送通道关闭了,这时候处于半关闭状态,即客户端已经没有数据要发送了(已经发了FIN结束信号),但是服务器若发送数据,客户端依然要接受 。这个状态要持续一段时间,也就是整个CLOSE_WAIT状态持续的时间 。


推荐阅读