TCP协议之

网友投稿 614 2022-10-17


TCP协议之<你好——再见>

1:TCP协议简介

2:TCP协议报头的结构分析

3:TCP协议三次握手

4:TCP协议四次挥手

5:抓包实验过程呈现

一、TCP协议简介

作为TCP/IP协议栈的核心协议之一,TCP协议早已成为可靠数据传输的首选协议之一,众多的协议都是基于TCP协议之上的,例如:远程连接协议Telnet、ssh协议、:本机应用进程端口

目的端口:目的主机应用进程端口

序列号:主机发送的数据报的序号(第几个)

确认号:发送给对方下次要发送的数据报的序列号(暗示上个数据帧已经接收到了)

数据偏移:指数据报中的数据在本报文中的起始位置,反过来也就是TCP头部的长度。TCP报文头部是以4个字节为单位的,数据偏移位为四个字节,虽大表示15,所以最大能表示TCP报文头部的长度为15*4=60字节。报文的选项位是可以不要的,所最小的长度是20字节。

保留位:顾名思义,正在保留。

URG:表示报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效

ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。(ack小写表示确认号)

PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中。

RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段

SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段。

FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段

窗口大小:表示现在充许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量

校验和:提供额外的可靠性

紧急指针:标记紧急数据在数据字段中的位置

选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为40字节

最大报文段长度:Maxium Segment Size,MSS

指明自己期望对方发送TCP报文段时那个数据字段的长度。默认是536字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。

窗口扩大:Windows Scaling

TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项。

时间戳: Timestamps

可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。

三、TCP三次握手

通过对上面TCP报文首部的字段进行了一些认识,接下来跟随小编去看看TCP是如何进行连接的。废话不多说,直接上图解释:

在TCP三次握手的建立中,主动发出请求的一方称为客户端,被动提供服务的一方是服务器端。从图中,我们可以看出,在整个建立连接的过程中,客户端和服务器端共有5种状态:Closed 、LISTEN、SYN-SENT、SYN-RCVD、ESTAB-LISHED。

CLOSED 没有任何连接状态

LISTEN 侦听状态,等待来自远方TCP端口的连接请求

SYN-SENT 在发送连接请求后,等待对方确认

SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认

ESTABLISHED 代表传输连接建立,双方进入数据传送状态

整个传输过程如下:

请求方发送请求建立连接的报文,报文中携带的标志位SYN=1,seq=0,ACK=0,由上面我们了解到SYN标志位为同步标志位,表明,客户端要与服务器建立连接,seq=0是携带包的序列号,因为这是传输过程中的第一个包,所以没有ack的值,在首次请求的时候,这是ACK标志位唯一一次等于0的时候,因为,TCP协议规定,在建立连接后,ACK标志位,必须为1。

请求端发送完请求之后,立马进入SYN-SENT 状态进行同步等待,而处于监听状态的服务器端接收到请求后,如果条件满足,就给客户端回应一个统一进入同步状态的报文,并立即进入SYN-RCVD状态。

客户端收到服务器的同意建立连接报文后,再给服务器反馈一个确认收到的报文,并立即进入ESTAB-LISHED状态。

服务器收到客户的确认后,立马进入ESTAB-LISHED。

在发送建立连接的报文中需要将SYN标志位标记为1,在确认报文中,并不需要SYN,但必须要使ACK=1。

四、TCP协议四次挥手

有聚必有散,在双方都进行传输完成后,需要断开连接,同样的为了体现TCP的可靠性,断开连接的时候也不能草草断开,必须确保双方都同意了断开,并确认断开才行。不废话,上图说明:

看到没,建立连接容易,可是断开可不是那么简单,所谓的有始有终,也许正是TCP的体现吧。猛地看去貌似有些乱,但是仔细的分析一下发现,断开的过程中一共有ESTAB-LISHED、FIN-WAIT1、FIN-WAIT2、CLOSE-WAIT、LAST-ACK、TIME-WAIT、CLOSED七种状态。

CLOSED 没有任何连接状态

FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认

FIN-WAIT-2主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求

TIME-WAIT 完成双向传输连接关闭,等待所有分组消失

CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认

LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失

CLOSING 双方同时尝试关闭传输连接,等待对方确认

过程说明:

当一方觉得没什么服务需要的时候,请求断开连接,发送的报文中携带的FIN标志位为1,表示这是一个终结会话的报文。

当服务器收到后,一看这是一个请求断开连接的报文,这个时候服务器就会考虑,看是否还有数据需要发送或者正在发送,这个时候分两种情况,我们先说一种,另一种,在下文进行说明,当服务器还有数据需要发送或者正在发送的时候,服务器给客户端发送一个确认收到断开连接请求的报文,这个报文是不携带标志位FIN=1的,因为,只是一个确认收到客户端信息的报文,并没有同意立马断开,因为服务器有数据正在传输。

当客户端收到服务器的确认报文后,一看报文中标志位FIN没有为1,说明服务器可能还没传输完毕,于是,客户端就进入FIN-WAIT2阶段进行等待。

当服务器数据传输完毕之后,会主动向客户端发送请求断开连接的报文,并携带标志位FIN=1 的报文,这个时候服务器进入LAST-ACK(最后确认阶段),它要等客户端收到我的请求后才能断开呀,所以进入最后的确认等待阶段。

客户端收到断开连接的报文后,立马发送确认报文,确认收到了服务器的断开请求,携带标志位ACK=1的报文,并立即进入最后的TIME-WAIT阶段,这个阶段时长为两个最大传输时长(2MSL),是为了确保正在路上的数据包在断开接收端口之前能全部到达。计时一到就关闭。

服务器端收到客户端的确认报文后立即进入关闭状态,一个完整的TCP连接正式结束。

额外补充:

如果客户端和服务器端同时发送请求断开连接报文,就会同时进入closeing状态。发送确认报文,进行断开,中间的FIN-WAIT2阶段会省略。

五、抓包实验过程呈现

到这里,一个完整的TCP连接建立并且成功断开。接下来小编带你去捉几个包看看,验证这个过程,废话不说,截图为证:

三次握手的包,头两个包带有标志位SYN=1,最后一个位ACK=1进行确认。

哈哈,看吧,是不是与文中介绍的对上号了呢。说明这个实验是一个完美的实验,每一步都非常的准确。到这里,小编的实验就结束了,如果有什么不足的地方,请多多指教,如果你有疑问,小编很乐于帮助你解答疑惑。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring cloud gateway 如何修改请求路径Path
下一篇:https协议证书部署实战
相关文章

 发表评论

暂时没有评论,来抢沙发吧~