【原创】“三次握手,四次挥手”你真的懂吗?

本文详细解析了TCP协议中序列号的处理机制,特别是针对32位无符号整数序列号在发生回绕时的比较算法。通过具体示例,展示了如何正确判断序列号的前后关系,避免因回绕导致的误判。此外,还提供了网络状态检查的命令,如使用netstat和tcpdump来监控连接状态和抓取网络数据包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ISN = M + F(localhost, localport, remotehost, remoteport)ISN = M + F(localhost, localport, remotehost, remoteport)
/** The next routines deal with comparing 32 bit unsigned ints * and worry about wraparound (automatic with unsigned arithmetic).*/static inline int before(__u32 seq1, __u32 seq2){
    return (__s32)(seq1-seq2) < 0;}#define after(seq2, seq1) before(seq1, seq2)/** The next routines deal with comparing 32 bit unsigned ints
* and worry about wraparound (automatic with unsigned arithmetic).*/

static inline int before(__u32 seq1, __u32 seq2){    return (__s32)(seq1-seq2) < 0;}

#define after(seq2, seq1) before(seq1, seq2)
假设seq1=255, seq2=1(发生了回绕)。
seq1 = 1111 1111 seq2 = 0000 0001
我们希望比较结果是
 seq1 - seq2=
 1111 1111
-0000 0001
-----------
 1111 1110

由于我们将结果转化成了有符号数,由于最高位是1,因此结果是一个负数,负数的绝对值为
 0000 0001 + 1 = 0000 0010 = 2

因此seq1 - seq2 < 0假设seq1=255, seq2=1(发生了回绕)。
seq1 = 1111 1111 seq2 = 0000 0001
我们希望比较结果是
 seq1 - seq2=
 1111 1111
-0000 0001
-----------
 1111 1110

由于我们将结果转化成了有符号数,由于最高位是1,因此结果是一个负数,负数的绝对值为
 0000 0001 + 1 = 0000 0010 = 2

因此seq1 - seq2 < 0
查看是否有连接溢出
netstat -s | grep LISTEN查看是否有连接溢出
netstat -s | grep LISTEN
tcpdump -w /tmp/a.cap port 6379 -s0
-w把数据写入文件,-s0设置每个数据包的大小默认为68字节,如果用-S 0则会抓到完整数据包tcpdump -w /tmp/a.cap port 6379 -s0
-w把数据写入文件,-s0设置每个数据包的大小默认为68字节,如果用-S 0则会抓到完整数据包
tcpdump -r /tmp/a.cap -n -nn -A -x| vim -
(-x 以16进制形式展示,便于后面分析)

10:55:45.662077 IP dev2.39070 > dev.6379: Flags [S], seq 4133153791, win 29200, options [mss 1460,sackOK,TS val 2959270704 ecr 0,nop,wscale 7], length 0


0x0000:  4500 003c 08cf 4000 3606 14a5 0ab3 b561 0x0010:  0a60 5cd4 989e 18eb f65a ebff 0000 0000 0x0020:  a002 7210 872f 0000 0204 05b4 0402 080a 0x0030:  b062 e330 0000 0000 0103 0307

10:55:48.090073 IP dev2.39070 > dev.6379: Flags [P.], seq 1:15, ack 1, win 229, options [nop,nop,TS val 2959273132 ecr 3132256230], length 14


0x0000:  4500 0042 08d1 4000 3606 149d 0ab3 b561 0x0010:  0a60 5cd4 989e 18eb f65a ec00 fe33 5504 0x0020:  8018 00e5 4b5f 0000 0101 080a b062 ecac 0x0030:  bab2 6fe6 2a31 0d0a 2434 0d0a 7069 6e67 0x0040:  0d0a
0x2a31         -> *1
0x0d0a         -> \r\n
0x2434         -> $4
0x0d0a         -> \r\n
0x7069 0x6e67  -> ping
0x0d0a         -> \r\n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值