TCP三次握手四次挥手理论加实例详解
2011-09-15 15:38
330 查看
TCP(Transmission Control Protocol) 传输控制协议
TCP 是主机对主机层的传输控制协议, 提供可靠的连接服务, 采用三次握手确认建立一个连接:
在socket编程中,客户端执行connect()时。将触发三次握手。
位码即 tcp 标志位, 有 6 种标示:SYN(synchronous 建立联机) ACK(acknowledgement 确认)
PSH(push 传送) FIN(finish 结束) RST(reset 重置) URG(urgent 紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
第一次握手:主机 A 发送位码为 syn=1, 随机产生 seq number=1234567 的数据包到服务器, 主
机 B 由 SYN=1 知道, A 要求建立联机;
第二次握手:主机 B 收到请求后要确认联机信息,向 A 发送 ack number=(主机 A 的
seq+1),syn=1,ack=1, 随机产生 seq=7654321 的包
第三次握手:主机 A 收到后检查 ack number 是否正确,即第一次发送的 seq number+1, 以及位
码 ack 是否为 1,若正确,主机 A 会再发送 ack number=(主机 B 的 seq+1),ack=1,主机 B 收到
后确认 seq 值与 ack=1 则连接建立成功。
完成三次握手,主机 A 与主机 B 开始传送数据。
在 TCP/IP 协议中, TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送 syn 包(syn=j) 到服务器,并进入 SYN_SEND 状态,等待
服务器确认;
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN
包(syn=k),即 SYN+ACK 包,此时服务器 进入 SYN_RECV 状态; 第三次握手:客户端收到服
务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进
入 ESTABLISHED 状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
实例:
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116 发送位码 syn=1, 随机产生 seq number=3626544836 的数据包到
192.168.1.123,192.168.1.123 由 SYN=1 知道 192.168.1.116 要求建立联机;
第二次握手:192.168.1.123 收到请求后要确认联机信息,向 192.168.1.116 发送 ack
number=3626544837,syn=1,ack=1, 随机产生 seq=1739326486 的包;
第 三次握手:192.168.1.116 收到后检查 acknumber 是否正确, 即第一次发送的 seqnumber+1,
以及位码 ack 是否为 1,若正确,192.168.1.116 会再发送 ack number=1739326487,ack=1,
192.168.1.123 收到后确认 seq=seq+1,ack=1 则连接建立成功。
图解:
一个三次握手的过程(图 1,图 2)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/fc88646112d6e515e0aff9e71eb5591e.jpg)
(图 1)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/f6f1fea05b6c50e285191d45af6d0338.jpg)
(图 2)
第一次握手的标志位(图 3)
我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/de88c2c12c05508d3f9d96646d956d24.jpg)
(图 3)
第二次握手的标志位(图 4)
我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN + ACK)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/3949ef0381c7cf4b4c1da04cde3374c1.jpg)
(图 4)
第三次握手的标志位(图 5)
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/82f4759c13bf660e3fc4297a9318e5e5.jpg)
(图 5)
一个完整的三次握手也就是 请求---应答---再次确认
四次分手:
在socket编程中,任何一方执行close()操作即可产生挥手操作。
由于 TCP 连接是全双工的, 因此每个方向都必须单独进行关闭。 这个原则是当一方完成它的
数据发送任务后就能发送一个 FIN 来终止这个方向的连接。 收到一个 FIN 只意味着这一方向上
没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主
动关闭,而另一方执行被动关闭。
(1)客户端 A 发送一个 FIN,用来关闭客户 A 到服务器 B 的数据传送(报文段 4)。
(2)服务器 B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1(报文段 5)。
和 SYN 一样,一个 FIN 将占用一个序号。
(3)服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A(报文段 6)。
(4)客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1(报文段 7)。
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK
和 SYN(ACK 起应答作用, 而 SYN 起同步作用) 放在一个报文里来发送。 但关闭连接时, 当收到
对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发
送给对方了,所以你可以未必会马上会关闭 SOCKET, 也即你可能还需要发送一些数据给对方之
后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN
报文多数情况下都是分开发送的。
2.为什么 TIME_WAIT 状态还需要等 2MSL 后才能返回到 CLOSED 状态?
这是因为虽然双方都同意关闭连接了, 而且握手的 4 个报文也都协调和发送完毕, 按理可以
直接回到 CLOSED 状态(就好比从 SYN_SEND 状态到 ESTABLISH 状态那样);但是因为我们必须
要假想网络是不可靠的,你无法保证你最后发送的 ACK 报文会一定被对方收到,因此对方处于
LAST_ACK 状态下的 SOCKET 可能会因为超时未收到 ACK 报文,而重发 FIN 报文,所以这个
TIME_WAIT 状态的作用就是用来重发可能丢失的 ACK 报文。
【转自】http://hi.baidu.com/jiang_yy_jiang/blog/item/4045af380c808e3596ddd857.html
http://blog.csdn.net/huichengongzi/article/details/6298939(图形化解释更好一点)
相关文章推荐
- TCP三次握手四次挥手过程详解
- TCP三次握手/四次挥手详解
- TCP三次握手/四次挥手详解
- TCP三次握手和四次挥手详解
- TCP三次握手/四次挥手详解
- TCP三次握手/四次挥手详解
- TCP三次握手/四次挥手详解
- TCP三次握手/四次挥手详解
- TCP三次握手/四次挥手详解
- 结合socket详解TCP三次握手四次挥手
- TCP三次握手/四次挥手详解
- TCP三次握手和四次挥手详解
- TCP三次握手四次挥手详解
- TCP三次握手四次挥手详解
- TCP三次握手/四次挥手详解
- TCP三次握手和四次挥手详解
- TCP三次握手四次挥手详解
- TCP三次握手/四次挥手详解
- tcp三次握手四次挥手(及原因)详解
- 详解TCP三次握手四次挥手