首页
社区
课程
招聘
[转帖] TCP三次握手分析
发表于: 2013-4-11 04:52 1236

[转帖] TCP三次握手分析

2013-4-11 04:52
1236
新闻链接  http://michaelkang.blog.51cto.com/1553154/1064944
新闻时间  2013-04-10 17:00
新闻正文     

TCP三次握手分析

tcp相关:

TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

Sequence number(顺序号码) Acknowledge number(确认号码)

tcp的三次握手:

第一次握手:主机A发送位码syn取值为1来建立连接(即syn=1),并且随机产生seq number取值任意(即seq number=1234567)的数据包到服务器。

第二次握手:主机B收到请求后,检查数据包发现SYN=1得知,A要求建立联机。然后向A发送syn+ack包取值都为1(即yn=1,ack=1),并且ack number=(主机A的seq+1),随机产生seq=7654321的包。

第三次握手:主机A收到后检查ack number是否为自己上次发送的seq numer+1,并且确认数据包里面ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。

tcp/ip的三次握手:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn=j的建立连接数据包到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到syn包,必须确认客户的SYN,然后发回ack=j+1的ACK确认包,同时发送一个syn=k的SYN建立连接数据包,即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。

tcpdump抓包分析:

1 Mint-ThinkPad-Edge wyy # tcpdump -i wlan0 tcp
2 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
3 listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
4 23:48:14.576489 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [S], seq 2876099301, win 14600, options [mss 1460,sackOK,TS val 5957112 ecr 0,nop,wscale 4], length 0
5 23:48:14.591469 IP 122.225.11.137.http > Mint-ThinkPad-Edge.local.40021: Flags [S.], seq 2879119328, ack 2876099302, win 5792, options [mss 1440,sackOK,TS val 4205016500 ecr 5957112,nop,wscale 7], length 0
6 23:48:14.591517 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [.], ack 1, win 913, options [nop,nop,TS val 5957116 ecr 4205016500], length 0
7 23:48:14.847849 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [P.], seq 1:992, ack 1, win 913, options [nop,nop,TS val 5957180 ecr 4205016500], length 991
8 23:48:14.877899 IP 122.225.11.137.http > Mint-ThinkPad-Edge.local.40021: Flags [.], ack 992, win 61, options [nop,nop,TS val 4205016787 ecr 5957180], length 0

这里的4-6行分别是三次握手的过程。

    第4行:第一次握手:

23:48:14.576489 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [S], seq 2876099301, win 14600, options [mss 1460,sackOK,TS val 5957112 ecr 0,nop,wscale 4], length 0

这里可以看到本机通过40021端口发送数据到122.225.11.137这个ip的web端口,Flags是[S],表明是syn建立连接包,seq是2876099301。这就是第一次握手:client发送syn请求建立连接包。

    第5行:第二次握手:

23:48:14.591469 IP 122.225.11.137.http > Mint-ThinkPad-Edge.local.40021: Flags [S.], seq 2879119328, ack 2876099302, win 5792, options [mss 1440,sackOK,TS val 4205016500 ecr 5957112,nop,wscale 7], length 0

这里可以看到122.225.11.137此ip通过web端口发回到本机40021端口,Flags是[S. ],表明是syn包和未知包,后面看到seq 和ack,说明未知包是ack确认包。ack是2876099302,刚好等于第四行的seq+1。还可看到seq 2879119328。这就是第二次握手:server回应给client的ack+syn确认建立连接包。

    第6行:第三次握手:

23:48:14.591517 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [.], ack 1, win 913, options [nop,nop,TS val 5957116 ecr 4205016500], length 0

这里可以看到本机通过40021端口连接122.225.11.137的web端口,Flags是[ . ]未知,后面可以看到ack确认包。

总结:

tcpdump里面抓tcp三次握手,看Flags标志依次是[S] [S . ] [ . ]基本就可以确认是一次完整的三次握手,分别是:client发的建立连接包,server回复的ack+syn确认连接包,还有client再次发送的ack确认包。

tcpdump可以加 --v参数察看详细解码。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//