TCP协议三次握手和四次挥手抓包分析

2019-10-31 16:51:03 浏览数 (1)

1、TCP数据段格式

ACK TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN(SYNchronization) :在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。

synchronization [ˌsɪŋkrənaɪ'zeɪʃn] 同步

FIN (finis)即完,终结的意思,用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

finis ['faɪnɪs] 终结

2、三次握手连接

1.连接开始时,连接建立方(Client)发送SYN包,并包含了自己的初始序号x;

2.连接接受方(Server)收到SYN包以后会回复一个SYN包,其中包含了对上一个x包

的回应信息ACK,回应的序号为下一个希望收到包的序号,即x+1,然后还包含

了自己的初始序号y;

3.连接建立方(Client)收到回应的SYN包以后,回复一个ACK包做响应,其中包含了下一个希望收到包的序号即y+1。

3、断开tcp连接时的4次挥手整体过程

1.当客户A没有东西要发送时就要释放A这边的连接,A会发送一个报文(没有数据),其中FIN设置为1, seq=u。

2.服务器B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。B会发送收一个报文,其中FIN设置为1, ack=u 1;A收到B的确认包后,进入等待状态,等待B请求释放连接。

3.服务器B向客户A发送断开连接请求,包中FIN=1,seq=w,ack = u 1。

4.A收到后回复一个确认信息,发送包,ack=w 1,并进入TIME_WAIT状态。

4、使用tcpdump抓包查看tcp三次握手过程

4.1建立连接

代码语言:javascript复制
 [root@docker-01 ~]# yum install tcpdump
 [root@docker-01 ~]# ssh root@172.17.2.25
 The authenticity of host '172.17.2.25 (172.17.2.25)'can't be established.
 RSA key fingerprint is SHA256:TL1e8gsDl uD crlcfs29HkPbdQih4zzse6/Z0k3lFg.
 RSA key fingerprint is MD5:5a:05:f9:bb:02:3d:05:55:cd:9a:14:0d:07:33:47:39.
 Are you sure you want to continue connecting (yes/no)? ###到这里就不用执行了,tcp已经建议连接

4.2查看数据包

代码语言:javascript复制
 [root@docker-01 ~]# tcpdump -i eth0 -vn -t tcp port 22
 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144bytes
 IP (tos 0x12,ECT(0), ttl 64, id 4546, offset 0, flags [DF], proto TCP (6), length 164)
    172.17.120.50.ssh > 192.168.255.27.49589: Flags [P.], cksum 0xe49e (incorrect -> 0x05ea), seq 1290388542:1290388666, ack 1470871262, win 77, length 124
 IP (tos 0x12,ECT(0), ttl 64, id 4547, offset 0, flags [DF], proto TCP (6), length 324)
 ##如果需要看绝对序号,可以在tcpdump命令中加-S
 [root@docker-01 ~]# tcpdump port 22 -c 3 -n -S
 tcpdump: verbose output suppressed, use -vor -vvforfull protocol decode
 listening on eth0, link-type EN10MB (Ethernet), capture size 262144bytes
 07:17:20.781294 IP 172.17.120.50.ssh > 192.168.255.27.49589: Flags [P.], seq 1290663038:1290663226, ack 1470872398, win 77, length 188
 07:17:20.781489 IP 172.17.120.50.ssh > 192.168.255.27.49589: Flags [P.], seq 1290663226:1290663398, ack 1470872398, win 77, length 172
 07:17:20.781565 IP 172.17.120.50.ssh > 192.168.255.27.49589: Flags [P.], seq 1290663398:1290663570, ack 1470872398, win 77, length 172
 3packets captured
 3packets received by filter
 0packets dropped by kernel

5、使用tcpdum抓取4次挥手数据包

代码语言:javascript复制
 [root@docker-02 ~]# tcpdump port 22 -n -S
 ##只看最后4个包就可以了
 17:29:31.709503 IP 172.17.120.51.57533 > 192.168.255.27.ssh: Flags [F.], seq 2176876951, ack 247624733, win 164, options [nop,nop,TS val 10421058ecr 9186853], length 0
 17:29:31.710515 IP 172.17.120.51.ssh > 192.168.255.27.57533: Flags [.], ack 2176876952, win 175, options [nop,nop,TS val 9186854ecr 10421058], length 0
 17:29:31.743381 IP 172.17.120.51.ssh > 192.168.255.27.57533: Flags [F.], seq 247624733, ack 2176876952, win 175, options [nop,nop,TS val 9186858ecr 10421058], length 0
 17:29:31.743433 IP 172.17.120.51.57533 > 192.168.255.27.ssh: Flags [.], ack 247624734, win 164, options [nop,nop,TS val 10421092ecr 9186858], length 0

0 人点赞