TCP那些事儿(一)

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

TCP头部结构

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

image.png

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

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

  • 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三次握手

先上图:


三次握手.png

第一次握手:

客户端构建一个数据包,将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四次挥手

四次挥手.png

第一次挥手:

客户端构建一个标志位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状态。

CSDN博客链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • TCP 作为互联网核心协议之一,全名Transmission Control Protocol首先了解一些基础概念...
    携一两本单色书来阅读 3,749评论 0 0
  • 目录: TCP是什么TCP报文结构TCP连接过程TCP状态转移TCP流量控制 —— 滑动窗口TCP拥塞控制TCP可...
    Katou_Megumi阅读 5,252评论 0 4
  • TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛...
    半岛夏天阅读 3,043评论 0 5
  • TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛...
    愛我你就抱抱我阅读 2,910评论 0 1
  • 这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP...
    愛我你就抱抱我阅读 3,777评论 0 0

友情链接更多精彩内容