TCP三次握手和四次断开(异常)

会挽雕弓如满月,西北望,射天狼。这篇文章主要讲述TCP三次握手和四次断开(异常)相关的知识,希望能为你提供帮助。
(一)ipv4报头:

TCP三次握手和四次断开(异常)

文章图片


1、Version:版本

2、IHL:首部长度,如果不带Option字段,则为20,最长为60,该值限制了记录路由选项

3、Type of Service:服务类型

4、Total Length:总长度,整个IP数据报的长度,包括首部和数据之和,单位为字节,最长65535,总长度必须不超过最大传输单元MTU。

5、Identification:标识,主机每发一个报文,加1,分片重组时会用到该字段

6、Flags:标志位
Bit 0: 保留位,必须为0。
Bit 1: DF(Don\'t Fragment),能否分片位,0表示可以分片,1表示不能分片。
Bit 2: MF(More Fragment),表示是否该报文为最后一片,0表示最后一片,1代表后面还有。

7、Fragment Offset:片偏移:分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。

8、Time to Live:生存时间:可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。

9、Protocol:协议:下一层协议。指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。

10、Header Checksum:首部检验和,只检验数据包的首部,不检验数据部分。这里不采用CRC检验码,而采用简单的计算方法。

11、Source Address:源IP地址

12、Destination Address:目的IP地址

13、Options:选项字段,用来支持排错,测量以及安全等措施

14、Padding:填充字段,全填0


(二)TCP报文包含6个标志位:
①urg:紧急指针

②ack:置1时确认

③psh:在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。

④rst:复位标志,这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包

⑤syn:同步标志,该标志仅在三次握手建立tcp连接时有效。

⑥fin:断开标志,带有该标志置位的数据包用来结束一个tcp回话,但对应端口仍处于开放状态,准备接收后续数据



(三)三次握手:(华为)


TCP三次握手和四次断开(异常)

文章图片

TCP三次握手和四次断开(异常)

文章图片



客户端:10.1.1.2
服务端:10.1.1.1
(1)客户端首先发送syn的请求,将syn=置1,序列号为seq=0
TCP三次握手和四次断开(异常)

文章图片

(2)服务端收到之后,它自己也是发送的,所以syn设置为1,发送自己的序列号seq=0,并且进行ack回复,回复的序列号为客户端的序列号+1,那ack回复的就是0+1
TCP三次握手和四次断开(异常)

文章图片


(3)客户端发送syn=0,表示不是第一次连接,ack置1,ack=1,并且把服务器发过来的seq序列号+1,当做ack发送,那就回复ack=1,因为对方发过来的seq=0
回复的时候是把对方的seq,用ack+1来回复
TCP三次握手和四次断开(异常)

文章图片



(四)四次挥手(华为--但是华为官方文档和现实抓包有区别,是优化机制吗?)
TCP三次握手和四次断开(异常)

文章图片



①正常情况:
TCP三次握手和四次断开(异常)

文章图片


②不正常情况:
TCP三次握手和四次断开(异常)

文章图片

【TCP三次握手和四次断开(异常)】以上图例的证明过程(异常):
TCP三次握手和四次断开(异常)

文章图片


(1)客户端发送断开的请求,将fin=1,ack=1,并且都携带序列号86,ack=65,这里的ack只是一个标志位是对上个报文的确认,在这里没啥大作用(这一步是正常的)
TCP三次握手和四次断开(异常)

文章图片


(2)服务器收到之后也发送应答,序列号设置为对方的ack号码,而自己要发送的ack是将对方的序列号+1那就为86+1=87{但是华为没有,这里如果没加1,那能确定确实是收到了对方的吗?我想的是能把,因为我原本原样的回复过去了},表示自己收到对面发来的断开请求,但是华为做了强化,还会置位自己的 fin+=1{第一次确认按照正常的话是没有fin置位的}(异常)
TCP三次握手和四次断开(异常)

文章图片


(3)服务器在发送序列号是65是对方ack的的号码,自己要发送的ack是对方的序列号+1为ack=87
TCP三次握手和四次断开(异常)

文章图片


(4)客户端回复,并且fin也是置位的,回复的ack为对端的序列号+1那么ack为65+1=66,seq还是之前第一个报文发送的值{这里应该是对方ack的值}
TCP三次握手和四次断开(异常)

文章图片



(五)疑问点:
1、为什么在四次断开的时候服务器第一次发的报文里面也要携带fin置位了?

2、为什么在四次断开的时候服务器第一次发ack的报文不应该是加1吗?


    推荐阅读