time_wait和close_wait区别
文章目录
为啥 time_wait 要等待 2MSL
- MSL: maximum segment lifetime, 30秒 – 1分钟
- 保证 TCP协议全双工主动关闭
为啥会出现大量的close_wait
- 首先 close_wait 一般出现在 被动关闭方
- 并发请求太多导致
- 被动关闭方未及时释放端口资源导致
|
|
tcp粘包、拆包
- 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包
- 接收方法不及时读取套接字缓冲区数据,这里发生粘包
- 进行MSS(最大报文长度)大小的 TCP分段, 当 TCP报文长度- TCP头部长度 >MSS 的时候发生拆包
如何能获得完整的应用数据报文:
- 带消息头的协议,头部写入长度【根据头部来获取内容】
- 设置定长消息,长度不够,补充固定的 padding字符
- 设置消息边界
\r
,\r\n
等等 - 使用其他更复杂协议, json,protobuf
实现简单的 tcp server
服务端代码
|
|
客户端代码
|
|
-
如果server端退出协程的时候,不调用
conn.Close()
会有什么问题呢?- 答案: 会进入 close_wait 状态, 服务端 接收到了
fin
断开连接的请求, 但是 没有回发fin
给客户端,这样就会一直在close_wait
状态 , 具体可以查看上面的 图片。 - 客户端 一直等待服务端的 fin ,等不到,只能一直 在
fin_wait_2
状态
- 答案: 会进入 close_wait 状态, 服务端 接收到了
-
如果 client 端 断开连接的时候,不调用
conn.Close()
会发生什么问题?- 答案: 一直卡在 establish状态 【因为没有调用 close方法,不会发 fin】, 只能等待 服务端 发送探测报文段,然后服务端关闭
实现简单的udp server
|
|
文章作者 LYR
上次更新 2022-01-23