快速搞懂TCP面向连接协议特性---三次握手,四次挥手


协议特性

面向连接,可靠传输,面向字节流

面向连接

在这里插入图片描述
典型问题
建立连接握手为什么是三次?

tcp是面向连接的,通信双方都必须确认对端具有数据收发能力.只是四次没必要,两次不安全.

断开连接挥手为什么是四次?

FIN只能表示对方不在发送数据,不表示对方不再接收数据,因此被动关闭方收到断开连接请求并进行回复后,还可以继续发送数据给对方,只有在确认自己不再发送数据的时候(也就是调用close的时候),才会给对方发送FIN.

主动关闭方进行最后一次回复后为什么会进入TIME_WAIT进行等待,而不是直接CLOSED释放资源?

如果最后一次的ACK丢包了,被动关闭方会对FIN包进行重传
假设没有TIME_WAIT,主动关闭方最后一次回复后直接释放资源,这种情况下一旦新启动一个socket使用了相同的地址信息,重传的FIN包就会对新的socket造成影响,最后一次回复后,进入TIME_WAIT等待一段时间就是为了避免新启动一个socket使用相同的地址信息,但是受到原有连接的影响
TIME_WAIT等待的时间是两个MSL(报文最大生存周期)时间,为了处理有可能重传的FIN,以及等待对重传FIN包的确认回复消失在网络中,完全的避免了重传的数据对新连接造成影响
TIME_WAIT更多的是为了保护客户端(服务端通常就算重启也必须使用相同的地址信息)

一台主机上出现大量的CLOSE_WAIT状态的socket是什么原因?

CLOSE_WAIT是被动关闭方收到FIN进行回复之后出现的状态,会在调用close之后进入下一个状态LAST_ACK,因此一旦一台主机上出现大量的CLOSE_WAIT状态的socket则表示你的程序中可能在对方关闭连接时没有关闭套接字释放资源,这是编程存在的错误,连接断开但是没有关闭套接字

一台主机上出现大量的TIME_WAIT状态的socket是什么原因?

TIME_WAIT是主动关闭方出现的状态,因此一台主机上出现大量的TIME_WAIT,意味着这台主机上进行大量的套接字主动关闭,常见于爬虫服务器(服务器作为主动关闭方)
解决方案:可以调整TIME_WAIT等待时间,也可以设置套接字选项----地址重用
在这里插入图片描述

tcp连接管理中的保活机制:
通信双方长时间(默认7200s)没有数据通信,则服务器会间隔(默认75s)向客户端发送保活探测数据包,连续(默认9次)没有响应则认为连接断开,这个时间都是可以通过设置套接字选项进行设置

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值