网络相关之TCP(有趣的对话)

 

有个大牛同学,每次谈到code相关的问题,他总是讲话很幽默。今天恰巧就看到了一则幽默的对话。

A对话:

“喂,你听的到吗?”

“喂,我听的到呀,你能听到我吗?”

“我能听到你,今天天气很好,balabala……”

 

B对话:

“喂,你听的到吗?”

“喂,我听的到呀,你能听到我吗?”

“喂,你听的到吗?

“——谁在说话”

“喂,你听的到吗?”

“。。。。。。”

 

C对话:

“喂,你听的到吗?”

“我听的到呀”“你能听到我吗?”

“——不想跟傻逼说话”

 

这三个场景作为程序员的你,应该很熟悉,场景A是三次握手,场景B是二次握手,场景C是四次握手。

 

TCP的三次握手:

第一次握手:建立连接时,客户端发送syn包(seq = j)到服务器,并进入SYN_SENT状态,等待服务器确认,syn包即同步序列编码;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack = j+1),同时自己也发送一个SYN包(seq = k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack = k + 1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,TCP链接成功,完成三次握手;

完成三次握手,客户端和服务端开始传送数据。如下图:

 

TCP的四次握手(关闭TCP链接) 

第一次握手:客户端会发送一个FIN报文给服务器之后会进入FIN_WAIT_1状态等待服务器的响应;

第二次握手:服务器收到了FIN之后,并确认是由客户端发起的,同时也会发送一个ACK=X+1的报文给客户端并进入CLOSE_WAIT状态;

第三次握手:等到客户端接收到ACK报文后,服务器关闭了与客户端的链接,会发送一条FIN报文给客户端;

第四次握手:客户端接收到由服务器发送来的FIN报文,就会关闭与服务器的链接,并且发送ACK给服务器。

 

TCP建立链接是三次握手,而断开链接是四次握手,这是为什么呢?

链接时,服务器收到客户端的SYN链接请求的报文后,可以直接发送AYN+ACK报文,其中ACK用来响应,SYN用来同步;

关闭链接时,服务器收到SYN报文后,很大可能并不会马上关闭Socket链接,所以只能先回复一个ACK报文,告诉客户端你发送的FIN报文我收到了,只有等到服务器的所有报文发送完了,服务端才会发送FIN报文,所以才需要四次握手。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值