1. 概述
尽管 TCP 和 UDP 都使用相同的网络层协议 — IP 协议,但他们却提供着完全不同的服务。
TCP 是一种面向连接、可靠的字节流服务,一个 TCP 连接中仅有两方进行彼此通信,因此广播和多播不能作用于 TCP。
2. TCP 的传输过程与可靠性
1. 应用数据被分割成 TCP 认为最合适的数据块进行发送,而 UDP 则不会,TCP 传递给 IP 的信息被称为“报文段”或“段”,即 TCP 首部与 TCP 数据构成的一个片段 2. TCP 发出报文段后会启动定时器,等待接收端的确认,如果超时则重发这个报文段 3. TCP 接收端接收到数据后,会先确认检验和,如果有差错则丢弃报文段并期待发送端的重发,否则在几毫秒的延迟后会发送一个确认 4. TCP 接收端对于接收到的若干个报文段会进行重新排序,丢弃重复的数据 5. TCP 的每一端都有固定大小的缓冲空间,用于提供流量控制,TCP 接收端只允许另一端发送接收端缓冲区所能容纳的数据,以防止较慢主机的缓冲区溢出
3. TCP 首部
TCP 首部中包含了:
- 源端和目的端的端口号 — 用来寻找发端和收端应用程序,加上 IP 首部中的源 IP 和目的端 IP 可以唯一确定一个 TCP 连接
- 序号 — 用来标识从发送端向接收端发送的字节流,对每个字节进行计数,达到 2^32-1 后重新从 0 开始计数
- 窗口大小 — 滑动窗口协议所使用的窗口大小
- 选项 — 一些额外的可选字段,最常用的是 MSS(最长报文大小),通常在通信的第一个报文段,即 SYN 报文段中指定 MSS 的大小,指明本端能够接收的报文段最大长度
TCP 首部中还包含以下六个标志位:
TCP 首部中的标志位
标识 | tcpdump 中的缩写 | 介绍 |
---|---|---|
URG | | 紧急指针 |
ACK | . | 确认序号 |
PSH | P | 尽可能快的将数据送往接收进程 |
RST | R | 重新连接 |
SYN | S | 同步序号,用来发起一个连接 |
FIN | F | 完成发送任务 |
- PUSH 标志(PSH)用来通知接收方不需要为了等待其他数据而让这条报文一直滞留在缓存中,接收方接到 PSH 报文时则不需要进行判断是否还需要等待额外的数据,而立刻从缓存中取出提交给相应的程序处理
- URGENT 标志(URG)用来通知另一端具有某种方式的紧急数据已经被放置在数据流中,16bit 的紧急指针用来方式一个偏移量,通过该偏移量与 TCP 首部中的序号字节相加可以得出紧急数据的最后一个字节的序号,这样接收端不需要考虑数据流的处理而优先处理紧急报文段
4. TCP 的建立和终止
5. 经受时延的确认
通常,TCP 在接收到数据时并不立即发送。 ACK,他推迟发送,与需要沿相同方向发送的数据一起发送,来减少发包的数量,也被称为“数据捎带ACK”。 绝大多数实现采用时延为 200ms。