TCP那些事儿(一)

按照惯例,我们先讲TCP三次握手与四次挥手。

TCP头部结构

TCP三次握手做了哪些多动作,他是怎么确认连接的呢,要想了解这个,我们先来看一下TCP报文的头部结构!

图片我就不画了,引用自水印上的那位朋友,这里贴上他的空间链接 

我们来了解一下,报文头部的每一个字段都代表什么意思:

  • 16位Source port&Destination port:源端口和目标端口,他们和源IP/目标IP一起共同唯一的确定一条TCP链接
  • 32位Sequence number:数据序列号,表示报文中第一个字节的数据的序号,用来确认数据。
  • 32位Acknowledament number:确认序列号,仅当ACK标准为1时有效,表示期望收到的下一个数据包的第一个字节的序列号。
  • 4位Data offset:数据偏移,表示头部的长度
  • Reserved:保留位
  • NS:实验标志
  • CWR:中间路由拥塞状态标志位
  • ECE:中间路由拥塞使能标志位,表示是否支持中间路由进行拥塞状态修改
  • 6位标志位:
    • UEG:表示紧急指针(Urgent pointer)是否有效。
    • ACK:表示确认序列号(Acknowledament number)是否有效。
    • PSH:提示接收方应尽快将这个报文交给应用层,为接收后续数据腾出空间。
    • RES:表示要求对方重新建立连接。
    • SYN:表示请求建立一个连接。
    • FIN:表示通知对方要关闭连接
  • 16位Window size:窗口大小:代表窗口的数据字节容量,告知对方本段的TCP接收缓冲区还能容纳多少字节的数据。用来控制发包速度。
  • 16位Check sum:校验和,有发送端填充,用来提供给接收端对数据包进行校验,确认数据包是否损坏,是TCP可靠传输的重要保障。
  • 16位Urgent pointer:紧急指针,是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。
  • Options:头部选项:TCP头部的最后一个字段,可变长度,但最多不得超过40字节,因为TCP头部总长不得超过60字节。

了解完TCP的头部结构,我们再来看看TCP的三次握手,你就会对他的每一步操作更加清晰,知道他每一步后面的意义。

TCP三次握手

先上图:

 

第一次握手:

客户端构建一个数据包,将SYN标志置位1,然后随机产生一个数据序列号seq=J,并将该数据包发送给服务端,然后客户端进展SYN_SENT状态,等待服务端确认。

第二次握手:

服务端接收到数据包后,判断标志位SYN=1得知客户端请求建立连接,然后构建一个数据包,将标志位SYN和ACK都置为1,然后根据客户端发送的数据包的序列号,将确认序列号加1,即ack=J+1,再随机生成一个数据序列号seq=K。然后发送给客户端。服务端进入SYN_RCVD状态。

第三次握手:

客户端收到确认数据包后,检查确认序列号ack是否等于J+1,标志位ACK是否为1,如果正确,则构建一个标志位ACK位1,确认序列号ack=K+1的数据包发送给服务端,服务端检查确认序列号是否为K+1,ACK是否为1,如果正确,则建立连接成功,Client都进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。


2022-01-28

TCP四次挥手

 

第一次挥手:

客户端构建一个标志位FIN=1,数据序列号为sep=u的挥手包给服务端,告知服务端客户端数据已经发送完成,现在请求关闭连接。这个时候客户端状态会由ESTABLISHED状态变更为FIN-WAIT-1状态。

第二次挥手:

服务端收到数据包后,检查到标志位FIN=1后知道客户端数据已经发送完成,正在请求关闭连接。服务端后构建一个标志位ACK=1,数据序列号为seq=v,确认序列号ack=u+1的数据包发送给客户端,告知客户端,我已经收到了你的关闭连接的申请;然后服务端状态会由ESTABLISHED状态变更为CLOSE-WAIT状态。客户端收到数据包后,检查到标志位ACK=1,确认序列号ack=u+1,知道服务端已经收到了他的关闭申请,这个时候客户端状态会由FIN-WAIT-1状态变更为FIN-WAIT-2状态。

到这里,可以理解为,客户端往服务发送数据的通道已经关闭了。

接下来便是关闭服务端往客户端发送数据的通道了。

第三次挥手:

服务端收到客户端的挥手包后,会检查自身是否还有需要发送给客户端的数据包,如果没有,就会构建一个标志位ACK=1,FIN=1,确认序列号ack=u+1,数据序列号为seq=w的挥手包发送给客户端,告知客户端,服务端数据也发送完成了,可以关闭连接了;然后服务端状态会由CLOSE-WAIT状态变更为LAST-ACK状态。

第四次挥手:

客户端收到数据包后,检查到标志位FIN=1,确认序列号ack=u+1,知道服务端那边数据也发送完了,正在请求关闭连接;这个时候客户端会构建一个标志位ACK=1,数据序列号seq=u+1,确认序列号ack=w+1的数据包给服务端,然后客户端进入TIME_WAIT状态;服务端收到数据包后,检查到确认序列号ack=w+1,标志位ACK=1,知道客户端已经收到了服务端的关闭连接的请求,服务端进入CLOSED状态。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值