TCP/IP三次握手及四次挥手

来源:互联网 发布:php urldecode 在线 编辑:程序博客网 时间:2024/05/09 13:52

三次握手:

首先上个图:
这里写图片描述

然后再来描述下这个过程罢!

a.首先,客户端向服务器发送SYN请求(序列号X,Y为随机数),请求连接。
b.然后,服务器收到请求,向客户端发送SYN(X=X+1),ACK响应表明自己收到请求,并且同意连接。
c.最后,客户端收到服务器端的响应后,发送ACK建立连接。
连接好后,客户端与服务器便可以开始通信了。

好的,以上是官方连接语言,觉得自己记不住就记下面这个:

默认:A是客户端,B是服务器

A对B说:“我想送你礼物,你要不要?”
B说:“要啊要啊。”
A说:“好的。”
,,,,送礼物中,,,,

四次挥手

先上图:
这里写图片描述

描述描述:

a.首先,客户端向服务器发送FIN表示即将关闭通信,请求服务器的认可,此时状态是半关闭的。
b.然后,服务器收到请求,回应客户端表明自己同意断开,但是先把当前数据传输完,此时发送两个数据,一个之前还未发送完的数据,和一个对断开通信响应的FIN。
c.最后,客户端收到服务器同意断开的FIN,再发送响应ACK表明数据收到,此时便可以断开通信了。

至此,客户端与服务器便断开了。

默认:A是客户端,B是服务器

A对B说:“我妈妈喊我回家吃饭呢,我要走了。”
B对A:“等会,等会,我把这个故事给你讲完。”
,,,,讲故事中,,,,
B对A说:“讲完了,你回家吧。”
A对B说:“嗯嗯,好的,那我走了。”
,,,,回家中,,,,

【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。等待状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。
其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。
只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以等待状态就是用来重发可能丢失的ACK报文。

2 0
原创粉丝点击