如何构造一个 SYN_SENT 状态的连接

对于客户端而言:

初始的状态是处于 CLOSED 状态。CLOSED 并不是一个真实的状态,而是一个假想的起点和终点。


客户端调用 connect 以后会发送 SYN 同步报文给服务端,然后进入 SYN-SENT 阶段,客户端将保持这个阶段直到它收到了服务端的确认包。


如果在 SYN-SENT 状态收到了服务端的确认包,它将发送确认服务端 SYN 报文的 ACK 包,同时进入 ESTABLISHED 状态,表明自己已经准备好发送数据。

node2:/root/test#time python t18.py 
Traceback (most recent call last):
  File "t18.py", line 6, in <module>
    s.connect(("1.1.1.1",8089))
  File "/usr/local/python27/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 110] Connection timed out

real	1m3.031s
user	0m0.024s
sys	0m0.006s

Last login: Sun Mar  8 11:05:42 2020 from 192.168.137.1
node2:/root#netstat -na | grep 1.1.1.1
tcp        0      1 192.168.137.3:36674         1.1.1.1:8089                SYN_SENT    
node2:/root#
node2:/root#tcpdump -S -i eth1 '((tcp) and  (port 8089) and (host 1.1.1.1))'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
12:09:35.772552 IP node2.36705 > one.one.one.one.8089: Flags [S], seq 4166753538, win 14600, options [mss 1460,sackOK,TS val 199217467 ecr 0,nop,wscale 7], length 0
12:09:36.772292 IP node2.36705 > one.one.one.one.8089: Flags [S], seq 4166753538, win 14600, options [mss 1460,sackOK,TS val 199218467 ecr 0,nop,wscale 7], length 0
12:09:38.772543 IP node2.36705 > one.one.one.one.8089: Flags [S], seq 4166753538, win 14600, options [mss 1460,sackOK,TS val 199220467 ecr 0,nop,wscale 7], length 0
12:09:42.772616 IP node2.36705 > one.one.one.one.8089: Flags [S], seq 4166753538, win 14600, options [mss 1460,sackOK,TS val 199224467 ecr 0,nop,wscale 7], length 0
12:09:50.772741 IP node2.36705 > one.one.one.one.8089: Flags [S], seq 4166753538, win 14600, options [mss 1460,sackOK,TS val 199232467 ecr 0,nop,wscale 7], length 0
12:10:06.772496 IP node2.36705 > one.one.one.one.8089: Flags [S], seq 4166753538, win 14600, options [mss 1460,sackOK,TS val 199248467 ecr 0,nop,wscale 7], length 0
SYN 包重传了 6 次,这个值是由/proc/sys/net/ipv4/tcp_syn_retries决定的, 在我的 Centos 机器上,这个值等于 6
cat /proc/sys/net/ipv4/tcp_syn_retries
6
原文地址:https://www.cnblogs.com/hzcya1995/p/13348491.html