TCP协议的三次握手和四次挥手白话文详解+必考面试题

首先说下四次握手协议(双方准备好资源的过程)

当client客户端套接字调用connect()方法后,会自动和serve服务端进行握手协议

● 当client发送syn(请求数据包) 比如发了个11给serve,询问serve端是否准备好了资源

● serve为了回复client自己准备好了,发送ack(回复数据包)给发来的数值加了1变为12发回去

● 然后serve要给client发送syn(请求数据包)比如发了个22,询问client端是否准备好了资源

● client回复serve自己也准备好了资源发送ack(回复数据包)给发来的数值加了1变为23发回去

● 这样四次握手交流没有问题后client端成功连接上serve端。

在这里插入图片描述
·

为啥会变成三次握手协议呢,当用户上网浏览网页,连接服务器时,肯定想要以更快的速度连接上服务器,那么在进行连接的时候为了减少不必要的等待时间,在第二次握手时,serve端发送回复数据包给client端告诉他自己准备好了资源的同时,顺便对client也发送了syn(请求数据包),这样就成了三次握手
在这里插入图片描述
·

·

三次握手出现的问题:

1.第三次没有收到ack回复包怎么办?

答:当serve端在一段等待时间里面没有收到ack回复包时,会重发ack+syn包,client收到后会再次发送ack回复包,当serve端多次重发(默认重发5次)没有收到回应时,会自动关闭连接

·

·

·

关于四次挥手(释放资源的过程)

● 一般由客户端首先发起关闭

● 客户端创建的套接字调用close()方法后,会告诉服务器端自己要关闭了

● 服务器端回复客户端自己收到了消息

● 当服务器端新创建的为客户端专门服务的套接字调用close()方法后,会告诉客户端自己对你的服务关闭了

● 客户端回给服务器端自己收到了
在这里插入图片描述
·
·
·

四次挥手的几个问题:

1.为什么服务器端的第二三次挥手不能合并成一次?

答:服务器端在收到客户端发来的关闭请求后,会立刻回复自己收到了,但是服务器端在关闭专门为客户端创建的套接字之前,可能仍需有代码需要运行并占用一定的时间,所以无法合并成一次

·
2. 客户端怎么知道最后发给服务器端的信息,服务器端一定能收到?

答:在服务器端会有一段等待时间叫 超时时间 ,等待客户端发送返回的消息,当等待的时间超过了超时时间,服务器端会重新发送套接字关闭的信息给客户端,当重发到一定次数后,则需要针对客户端的问题进行解决

·

3.为什么一般客户端先发送关闭信息?()

答:先发送关闭消息的一端,最后会发送 “收到消息” 给对方,为了避免由于出现了某些问题,导致最后对方没有收到我的消息,我就已经释放了资源,因此先发送的一方最后会有一段等待资源释放的时间,一般是2MSL(1个数据包在网络上存活的最长时间的两倍时间),等待对方是否会因为没收到我回发的消息而给我重发关闭消息,当2MSL的时间到了以后,就会直接释放资源,而在这段时间里面,这一端无法做任何事,只能进行等待,因为绑定的端口会被占用进行资源释放的等待。

客户端一般不绑定端口,操作系统随机分配端口,而服务器端必须绑定端口,一旦服务器端绑定的端口因为进行资源释放前的等待,会导致服务器端无法与其他客户端进行连接。

·

4.为什么在运行服务器端会出现OSError:[Errno 98]Address already in use问题?如何解决?

答:两种可能

1.服务器端中为客户端服务的套接字先调用close(),也就是服务器端成为先发送关闭消息的一端,为了避免因为出现某些问题,回发的接受包对方没收到而服务器端已经释放资源,最后会有一段等待资源释放的时间,在这段时间里面绑定的端口会被占用,因此在运行服务器时会报出这个问题

解决方法:在服务器端绑定端口前写上,即可

服务器套接字.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

2.服务器在后台依然运行,并没有结束

解决方法:杀死后台正在运行此服务器的进程

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此时一位小白路过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值