SYN:1 代表请求创建连接
FIN:1 表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为TCP的连接是双向的,所以一次FIN只能关闭一个方向。
ACK:代表确认接受,ACK=1,来表示数据接收成功。
seq:序列号,当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。初始序列号是随机生成的。
ack:服务端接收到数据包后进行确认的编号,ack是seq+1,
在创建连接时,
1.客户端发送syn包(编号seq=x)到服务器,请求创建连接(SYN=1)。
2.服务端接收到后,确认客户请求(ACK=1,ack=x+1),同时自己发送syn包(seq=y)告诉客户端请求创建连接(SYN=1):我接受到请求并处理了,我也想跟你建立连接,你确认下。
3.客户端收到服务器的SYN+ACK包,确认服务端状态(ACK=1,ack=y+1)。同时向服务器发送syn包( seq=x+1)告诉服务端:我接受到你的确认包了,可以开始通讯了。
三次握手完成!
举个打电话的例子:
A : 你好我是A,你听得到我在说话吗
B : 听到了,我是B,你听到我在说话吗
A : 嗯,听到了
建立连接,开始聊天!
在四次分手时,
1.首先客户端请发送一个FIN包(编号seq=u),表示要断开连接(FIN=1)。
2.服务端接收到请求后,确认客户请求(ACK=1,ack=u+1),同时发送数据包(seq=v)告知客户端需要确认当前服务端状态。
3.服务端完成状态确认(ACK=1,ack=u+1),向客户端发送FIN包(seq=w)请求关闭连接(FIN=1)。
4.客户端接收到服务器端请求(ACK=1,ack=w+1),同时发送数据包(seq=u+1)至服务器,告知收到请求并确认。
5.客户端等待两秒,确认服务端收到消息,否则重发一次确认消息。
四次分手完成!
四次挥手:
A:“喂,我不说了。”
B:“我知道了。等下,上一句还没说完。Balabala…..”
B:”好了,说完了,我也不说了。”
A:”我知道了。”
1.为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
2.如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。