概念
TIME_WAIT: socket 仍然有数据在内核中待发送直到发送成功或超时,此socket不能被内核删除,同时等待是否要重传Ack对端还已发过来的FIN
Linger Time:socket关闭后,如果send buffer里仍有数据,内核删除socket的超时时间,一般2min
SO_REUSEADDR
:如果有socket在TIME_WAIT状态,别的socket可以绑定和它相同的“地址:端口”
SO_REUSEPORT
:允许绑定相同的“地址:端口”,但要求前面的socket也设置了这个的属性
FIN-WAIT-1:发出FIN后,等待收到对方ack自己的FIN (等对方的FIN)
FIN-WAIT-2:收到对方的ACK后,等待收到对方的FIN,然后发出ACK (等对方的FIN,更近一步,自己的FIN已被ACK)
CLOSE-WAIT: 收到对方的FIN,发出了ACK (等用户Close)
TIME_WAIT: 重传ACK或数据(收到对方的FIN,自己也发了ACK,但不知道要不要重传)
ACK:TCP的ACK是下一个希望收到的sequence
Nagle算法: 延迟小包发送,直到收到Ack,优先是提高网络利用率,缺点是delay,不过也增加不多,因为ack收的越快,发送也越快,默认是开启的
1. Listening socket可读就表示有新的连接,通过accept获得新连接的fd
2. shutdown socket是关闭写入端,发送的FIN相当于给对端发送文件的EOF,对方收到EOF,读它的socket的时候会读到0. 这是TCP的半关闭特点,这样的目的是我自己不写了,但是仍然可以接受对方发来的数据。如果是close sockets,则这个socket既不能读也不能写了。如果对方恶意不关闭,有可能导致另一端的socket一直不关闭,那么就要手动关闭。
3. 三个小包问题导致网络资源消耗:
1)糊涂窗口 2)delayed Ack让Ack piggyback data,减少Ack的带宽消耗 3)Nagle算法让data delay发送,防止data发得太快,但会造成延时
4. TCP应用层分包是指通过一定的处理,让接收方能从字节流中识别并截取还原出一个个消息。短连接的TCP服务是指对方通过关闭连接来表示一个消息发送完毕。对于长连接,有几种方法分包:1. 固定长度 2. 特殊字符或字符串作为边界 3. 每个消息的头部加一个长度字段 4. 利用消息本身的格式,比如消息内有自己的头和尾<></>
5. TCP网络编程的主要例子:1. echo 2. 聊天服务