背景知识——互联网分层模型
- 应用层(DNS,FTP,HTTP,RTSP,SSH,TLS/SSL, XMPP, DHCP...)
- 传输层(TCP,UDP...)
- 网络层(IP,...)
- 链路层(ARP,...)
- 实体层
另外,也有将互联网分为7层的说法,他们分别是:应用层、
表示层(提供数据格式或转换服务。比如:加密与解迷,编码与解码,压缩与解压)、
会话层(为客户端的应用程序提供了打开、关闭和管理会话的机制)、
传输层、网络层、数据链路层、物理层。
TCP 是什么?
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流(byte stream)的传输层通信协议;
TCP 基于不可靠的 IP 协议,提供稳定、可靠的数据传输服务;
对于 TCP 需要知道的是,TCP 所处的第2层传输的数据叫 Segment,IP 所处的第3层传输的叫 Datagram, 第4层传输的数据则叫做 Frame;
数据从应用层往下传输,每经过一层都会在数据头部被加上一个 header ,层层封装;
反之,则需要层层解封,最后应用层才能取得数据。
TCP 特性
- 点对点协议
- 可靠
- 管道传输(同时送多个segments)
- sender & receiver 都有 buffer
- byte stream
- 双向传输
- 面向连接(oriented connection)
- 重传机制
TCP segment 结构体(这个非常重要)

- source port:源 Application 端口号
- dest port:目标 Application 端口号
TCP 三次握手(如何建立连接?)
- Client 传送一个 SYN segment 给 Server(init sequence number)
- Server 收到 SYN,回一个 SYNACK segment 给 Client(alloc buffer; init sequence number)
- Client 收到 SYNACK,再回一个ACK,从此连接才算是建立完成(同时,可以带上 data 做数据传输)
TCP 为什么需要三次握手?

TCP 四次分手(如何关闭连接?)
- client 传送一个 FIN segment 给 server,请求关闭连接
- server 回一个 ack 给 client,表示 client 可以关闭连接了
- server 再发一个 FIN segment 给 client,请求关闭连接
-
client 回一个 ack 给 server,表示 server 可以关闭连接,server 收到 ack ,关闭连接。此时,client 等待2MSL后依然没有收到回复,则证明 server 端已正常关闭,那好,client 也可以关闭连接了。
tcp_close.png
TCP 为什么需要四次分手?
简单来说,因为 TCP 连接是双向的,所以 sender 需要发送 FIN 征求 server 的同意;随后,server 收到 client 的请求,给 client 回复 ack,告诉它,此时可以关闭连接;而 server 同时也需要通知 client ,告诉它自己不会再传输数据了,所以,server 给 client 发送 FIN 信号;最后,client 收到 server 的请求, 回复 ack 表示同意。
TCP 如何保证数据传输是可靠的?
- 给 byte stream 编号
- receiver 校验数据的正确性
- receiver 回复 ack
- timer. 发生 timeout 时,重传
TCP 重传机制
为什么会重传?
1. 丢失 ack
Host A 给 Host B 传输 数据, 随后 Host B 给 A 回复 ack, 但由于网络原因,这个 ack 在传输过程中 loss 了, 那么经过一个 timeout 时间后,Host A 给 Host B 重新传送这份数据。
2. timeout
Host A 给 Host B 传输数据, 随后 Host B 给 A 回复 ack ,但由于网络延迟,这个 ack 在一个 timeout 时间内没有被及时送给 Host A,经过一个 timeout 时间后,重送数据,并且在收到延时的 ack 后, 按实际收到的数据回复 ack
3. 收到3次重复的 ack
由于 receiver 回复给 sender 的 ack 序列号表示期望下次 sender 送过来的数据的序列号,所以当 sender 收到 3次重复的 ack(也就是 ack 序列号都一样),这个时候就会重新发送丢包或者延迟的 packet
快速重传:在发生 timeout 之前重传数据。
TCP Nagle Algorithm & Delay Ack
以上两种策略都是针对TCP 频繁传送小包的情况,
- Nagle Algorithm: 发送一个小包后,如果这个小包还没有被 ack ,则后面等待发送的少量数据,会进入 buffer 缓冲区,
这部分数据在等待时间到了后才会被统一发送出去。 - Delay Ack: receiver 收到的数据如果不是按顺序送进来的,则会先不发 ack ,等一定顺序的数据都到了后,统一发 ack, 尽量减少 ack 的次数。
根据他们的处理机制可以知道,这两种策略都是牺牲时效性来提升性能。遇到时效性高的应用场景,可以自行关闭。
参考资料:
TCP Overview
TCP Flow Control and Congestion Control
通俗大白话来理解TCP协议的三次握手和四次分手
网友评论