TCP的seq和ack号计算方法

握手阶段:

序号方向seqackSYNACK
1A->B10000010
2B->A2000010000+1=1000111
3A->B1000120000+1=2000101

数据传输过程中seq和ack的值:

序号方向seqacksize
23A->B40000

70000

1514

24B->A

70000

40000+1514-54=41460

54

25A->B4146070000+54-54=700001514
26B->A70000

41460+1514-54=42920

54

其中1514表示以太网帧的长度,1514 - 54(以太网协议头=14字节,IP头=20字节,TCP头=20字节)= 负载长度

1. 如果发送方最后一次发送数据的时候,tcp.flags=0x018(PUSH,ACK)

那么接收方的确认ACK是发送方的seq和数据长度之和,即接收方的ack=发送方上个包的seq+数据长度

2. 如果发送方最后一次发送数据的时候,tcp.flags=0x019(FIN,PUSH,ACK)

那么接收方的确认ACK是发送方的seq和数据长度之和,还要加上1,即接收方的ack=发送方上个包的seq+数据长度+1。因为fin占一个序列号
————————————————
版权声明:本文为优快云博主「开源造福世界」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weijuqie0697/article/details/81487077

### TCP三次握手过程详解 TCP三次握手是建立可靠连接的关键步骤,以下是其具体过程: #### 第一次握手 客户端发起连接请求,将标志位`SYN`置为1,并随机生成一个初始序列`seq=J`,然后将此数据包发送至服务器。此时,客户端进入`SYN_SENT`状态,等待服务器的确认[^1]。 ```python # 客户端第一次握手示例 packet = { 'SYN': 1, 'SEQ': J, # 随机生成的初始序列 } send(packet) ``` #### 第二次握手 服务器接收到客户端的数据包后,通过判断标志位`SYN=1`得知这是连接请求。服务器随即也将自己的`SYN``ACK`标志位置为1,同时生成自身的初始序列`seq=K`,并将确认设为`ack=J+1`(表示已接收并认可客户端的序列)。随后,服务器将该数据包返回给客户端,进入`SYN_RCVD`状态[^1]。 ```python # 服务器第二次握手示例 response_packet = { 'SYN': 1, 'ACK': 1, 'SEQ': K, # 服务器的初始序列 'ACK_NUM': J + 1, # 对客户端序列的认可 } send(response_packet) ``` #### 第三次握手 客户端接收到服务器的响应后,验证`ack`是否等于`J+1`以及`ACK`是否为1。如果验证无误,则客户端将自己的`ACK`标志位置为1,并将确认设为`ack=K+1`,以此告知服务器其序列已被接受。最后,客户端将此数据包发送回服务器,双方均进入`ESTABLISHED`状态,完成三次握手[^1]。 ```python # 客户端第三次握手示例 final_ack_packet = { 'ACK': 1, 'SEQ': J + 1, 'ACK_NUM': K + 1, # 对服务器序列的认可 } send(final_ack_packet) ``` --- ### 解决与TCP握手相关的问题 在实际应用中,可能会遇到一些与TCP三次握手有关的问题,例如SYN洪泛攻击。这种攻击利用了服务器在收到SYN包后需创建半连接的特点,通过伪造大量不存在的IP地址发送SYN请求,使服务器资源耗尽。为了缓解此类问题,可以通过以下方法优化系统配置: - **缩短超时时间**:减少服务器维持半连接的时间,以便更快释放资源。 - **启用SYN Cookie技术**:无需为每个SYN请求分配内存空间,而是通过计算得出一个加密值作为确认依据[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值