TCP协议

IP数据包不可靠,需要又他的上层协议即TCP协议进行控制

传输控制协议——TCP

  1. 面向连接的,可靠的,基于字节流的传输层通信协议。
  2. 将应用层的数据流分割成报文段并发送给目标节点TCP层
  3. 数据包都有序号,对方收到则发送ACK确认,在规定时间内(RTT确认)未收到则重传
  4. 使用校验和来检验数据在传输过程中是否有误

TCP报头

v2-d19eca108278098a890806b6c3fd71c3_1440w v2-a154dc61d394b5d48d2e55cf18f6f45c_r

TCP三次握手

截屏2020-12-28 下午4.56.51

为什么需要三次握手才能建立连接?

为了初始化Sequence Number的初始值

首次握手隐患——SYN超时

Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认

Server不断重试直至超时,Linux默认重试五次,从一秒开始每次等待时间翻倍,等待63秒(1+2+4+8+16+32)才断开连接。

风险

可能会遭到SYN Flood攻击,不停发握手请求,Linux的保护措施是SYN队列满了后,通过tcp_syncokies参数回发SYN Cookie,

如果正常链接Client会回发SYN Cookie,直接建立连接。

保活机制

如果连接在保活时间处于非活动状态,server将向对方发送保活探测报文,如果未收到响应则继续发送

直到发送报文的次数达到保活探测数后任未响应则中断连接。

TCP 四次挥手

截屏2020-12-29 下午10.49.51

MSL:最长报文段寿命 liux中为30s

为什么有TIME-WAIT状态

  1. 防止server没收到ACK确认然后重发FIN包,一来一回正好两个MSL时间
  2. 避免新旧连接混淆(例如避免路由器缓存IP数据包,以至于和新连接的包混淆)

为什么需要四词挥手

因为是全双工,发送方和接收方都需要FIN和ACK报文。

server出现大量CLOSE-WAIT的原因

对方关闭连接,我方忙于读写,没有及时关闭连接,多数情况为代码有bug或线程数配置不合理等。

查看连接主机情况

1
netstat -n | awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'
截屏2020-12-29 下午11.06.05