包序管理:
- TCP连接双方总共维护两套序号,客户端维护一套,服务端维护一套
- 客户端在发送给数据的时候,消耗的是客户端维护的序号,在回复ACK的时候,是确认服务端的序号
- 服务端你在发送数据的时候,消耗的是服务端维护的序号,在回复ACK的时候,是确认客户端的序号
- 纯ACK数据包是不消耗序号的
三次握手:
四次挥手:
FIN:断开连接报文
MSL:报文最大生存时间
2MSL:丢失的ACK的MSL报文 + 重传的FIN报文
CLOSE_ WAIT:
- 被动断开连接方产生的状态
- 一旦产生这种状态,是由于被动断开连接方没有调用close关闭掉套接字描述符(不是侦听套接字,而是为客户端产生的新的套接字描述符)
- 是由于当前程序的执行流卡死在某一个阻塞流程当中,也就是意味着不能够调用到close函数
阻塞: accept
recv
TIME_ WAIT:
- TIME_ WAIT状态是主动断开连接方拥有的
- 如果当前是服务端处于TIME_ WAIT状态
- 服务端程序是结束掉了
- 当快速重新启动的时候,会发现报错: bind: Address already in use
- 原因:
- 虽然服务端程序已经结束了, 但是在内核当中端口并没有被络协议栈释放掉
- 一个端口只能被一个进程所绑定
端口重用:
- listenfd :侦听套接字
- SOL_ SLCKET :套接字选项
- SO_ REUSEADDR :重用端口
- 只有当服务端状态是TIME_ WAIT的时候才可以重用
- opt --> 1
- opt的大小