讲讲你对tcp三次握手,四次挥手的理解

TCP有6种标示:

SYN(建立联机) ACK(确认) PSH(传送) FIN(结束) RST(重置) URG(紧急)

seq(序列号):当发送一个数据时,数据会被拆分成多个数据包来发送,每个数据包大小会被放进TCP头部中,序列号就是对每隔数据包编号

ack(位确认号):接收方会将目前为止接收到的数据长度加起来,并写入TCP头部的ACK,然后返回,注意ack和ACK不同,一个是序号一个是标识

TCP三次握手概念:

建立TCP连接协议时,需要在客户端和服务器之间发送三个包,握手过程中传送的包里不包含数据三次握手完毕后,客户端与服务器才正式开始传送数据

原理流程(记图即可):

  第一次握手:

      客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x(随机int),此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

  第二次握手:

      TCP服务器收到请求报文后,如果同意连接,则向客户端发出确认报文。确认报文中应该 SYN=1确认号ACK =x+1,同时也要为自己随机初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。这个报文带有SYN(建立连接)和ACK(确认)标志,询问客户端是否准备好。

  第三次握手:

      TCP客户端进程收到确认后,还要向服务器给出确认。发出ack=y+1,此时,TCP连接建立客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。这里客户端表示我已经准备好。

设计原因:为什么要三次握手呢,有人说两次握手就好了

举例:已失效的连接请求报文段。

   client发送了第一个连接的请求报文,但是由于网络不好,这个请求没有立即到达服务端,而是在某个网络节点中滞留了,直到某个时间才到达server,本来这已经是一个失效

的报文,但是server端接收到这个请求报文后,还是会向client发出确认的报文,表示同意连接。假如不采用三次握手,那么只要server发出确认,新的建立就连接了,但其实这个

请求是失效的请求,client是不会理睬server的确认信息,也不会向服务端发送确认的请求,但是server认为新的连接已经建立起来了,并一直等待client发来数据,这样,server

很多资源就会被浪费,采用三次握手就是为了防止这种情况的发生,server会因为收不到确认的报文,就知道client并没有建立连接

TCP的四次挥手概念:

终止TCP连接协议时,需要在客户端和服务器之间发送四个包,确保数据传输完毕。

原理流程(记图即可):

客户端A要主动关闭发送FIN标记给服务端B,服务端B返回已收到终结命令但数据仍在处理的标记,客户端A进入wait状态,服务端B数据处理完后再发送标记给客户端A,客户端A回复后2MSL关闭连接,服务端B接收并关闭。

2MSL:即一个报文发送和回复所需的最大时间,TIME_WAIT状态就是用来重发可能丢失的ACK报文,如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

设计原因:那么为什么是4次挥手呢?

为了确保数据能够完成传输

      关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。可能有人会有疑问,tcp我握手的时候为何ACK(确认)和SYN(建立连接)是一起发送。挥手的时候为什么是分开的时候发送呢.因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,应用需要处理很可能并不会立即关闭 SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步挥手。

思考:客户端突然挂掉了怎么办?

正常连接时,客户端突然挂掉了,如果没有措施处理这种情况,那么就会出现客户端和服务器端出现长时期的空闲。解决办法是在服务器端设置保活计时器每当服务器收到客户端的消息,就将计时器复位超时时间通常设置为2小时。若服务器超过2小时没收到客户的信息,他就发送探测报文段。若发送了10个探测报文段,每一个相隔75秒,还没有响应就认为客户端出了故障,因而终止该连接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值