计算机网络面试题(一)三次握手、四次挥手

持续更新

TCP三次握手、四次挥手

三次握手

在这里插入图片描述
seq:序号,发送数据的初始序号,简单理解 发送方告诉接收端我发送的数据是从第1000开始的
ack:确认号,上一次成功接收的数据字节序号+1,接收方告诉发送端下一次想接收的序列号
ACK:=0表示确认号无效 =1 表示确认号有效
SYN:=1表示连接请求或者连接接受
例如:
服务器检测了seq=128,客户端下次发送的序号就是129,ack=147,客户端发的确认号就是147

第一次握手
客户端首先发送一个连接试探,ACK=0表示确认号无效,将SYN置为1(SYN=1表示这是一个连接请求或者连接接受报文,同时表示这个数据报 不能携带数据),随机产生一个序列号x,令seq=x(表示client自己的初始序列号 seq=0就代表这是第0号帧),发送给服务器,进入SYN_SEND状态,表示客户端等待服务器的回复。

第二次握手
服务器接收到Client的SYN=1的包以后,知道客户端请求连接,将自己的SYN置为1(连接接受),ACK置为1,随机产生一个序列号y,seq=y(server自己的初始序列号,seq=0就代表这是服务器这边发出的第0号帧),ack=x+1(表示期望收到对方的下一个报文段的第一个数据字节序列号是x+1,同时表明x为止的所有数据都已经正确收到,ack=1,其实是ack=0+1,也就是期望客户端的第一个帧),服务器进入SYN_REVD状态,表示服务器已经收到client的连接诶请求,等待client的确认。

第三次握手:
客户端收到服务器的包以后,先检查SYN是否等于1,ACK是否为1,ack是否为自己发送的序列号+1,
将ACK=1(表示ack=y+1有效),seq置为x+1(client自己的序列号,这是我的第一帧,相对于0号帧来说),ack=y+1(期望收到服务器的第一帧)客户端进入ESTABLISHED状态
服务器接收到客户端的包以后,检查ACK是否为1,ack是否为y+1,进入ESTABLISHED状态。
在这里插入图片描述

四次挥手

在这里插入图片描述
第一次挥手:Client发送一个FIN(例如第24帧),seq=u,为客户端最后一个发送给服务器的序列号,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client(请求我已经收到,但是我还没有准备好,请继续等待停止的消息),seq=v,为服务器继续发送的序列号,确认序号为收到序号+1,Server进入CLOSE_WAIT状态。此时**TCP链接处于半关闭状态,**即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收,客户端在接收到包以后,Client进入FIN_WAIT_2状态.
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,FIN=1,ACK=1,seq=w,ack=u+1,服务器进入LAST_ACK状态。
第四次挥手:Client收到FIN后,(知道可以关闭连接,但是他还是不相信网络),接着发送一个ACK给Server,Client进入TIME_WAIT状态,确认序号为收到序号+1,(Server端收到ACK后,就知道可以断开连接了)Server进入CLOSED状态,完成四次挥手

为什么TCP是握手三次 挥手四次

因为Sever端收到Client端的SYN请求连接时,可以直接发送SYN+ACK报文。(SYN是用来同步的表示连接接受, ACK报文用来应答的)但是关闭连接时,当server端收到Fin报文时,很可能并不会立即关闭socket,所以只能回复一个ACK报文,告诉客户端你发送的Fin报文我收到了 ,只能等到服务器的所有报文都发送完毕,才能发送Fin报文,因此不能一起发送。所以需要四次握手。

为什么不能两次握手连接

三次握手完成两个重要的功能,既要双方做好数据的准备工作(双方都知道彼此已经准备好),也要允许双方就初始序列号进行协商,这个序列号是在握手过程中被发送和确认。
如果两次握手会出现下面这种情况
例如客户端发出连接请求,但是因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求,后来收到了确认,建立了连接,数据传输完毕后就释放连接,客户端共发送了两个连接请求报文段,其中第一个丢失,第二个到达了服务器,但是第一个丢失的报文段只是在网络结点长时间滞留了,延误到连接释放后的某个时间才到达服务器,此时服务端误认为客户端又重新发出一次新的连接请求。于是就像客户端发出确认报文段,同意建立连接。
不采用三次握手,只要服务器发出确认,就建立新的连接,此时客户端忽略服务器发出来的确认也不发送数据,则服务端一致等待客户端发送数据,浪费资源。

如果已经建立连接,但是客户端突然出现故障了怎么办?

TCP设有保活计时器,客户端出现故障,服务器不能一直等下去,白白浪费资源。服务器每次收到一次客户端请求后都会重新复位计时器,通常设置为2小时,若两个小时还是没有收到客户端的任何数据,服务器会发送一个探测报文段,以每隔75秒钟发送一个,若一次发送10个探测报文还没反应,服务器就认为客户端出现了故障,接着就关闭连接。

参考博客
https://blog.csdn.net/sinat_21455985/
https://blog.csdn.net/qq_38950316/article/details/81087809
socket原理讲解https://blog.csdn.net/pashanhu6402/article/details/96428887

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值