TCP三次握手四次挥手理论加实例详解

 

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)

(图 1)

(图 2)

第一次握手的标志位(图 3)

我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)

(图 3)

第二次握手的标志位(图 4)

我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN + ACK)



(图 4)

第三次握手的标志位(图 5)
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)



(图 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(图形化解释更好一点)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值