传输控制协议 TCP 是 TCP/IP 协议栈中的传输层协议,它通过序列确认以及包重发机制,提供可靠的数据流发送和到应用程序的虚拟连接服务。与 IP 协议相结合,TCP 组成了因特网协议的核心。
由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用 TCP 的“端口号”完成的。网络 IP 地址和端口号结合成为唯一的标识,我们称之为“套接字”或“端点”。TCP 在端点间建立连接或虚拟电路进行可靠通信。
TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。
关于流数据传输,TCP 交付一个由序列号定义的无结构的字节流。这个服务对应用程序有利,因为在送出到 TCP 之前应用程序不需要将数据划分成块,TCP 可以将字节整合成字段,然后传给 IP 进行发送。
TCP 通过面向连接的、端到端的可靠数据报发送来保证可靠性。TCP 在字节上加上一个递进的确认序列号来告诉接收者发送者期望收到的下一个字节。如果在规定时间内,没有收到关于这个包的确认响应,重新发送此包。TCP 的可靠机制允许设备处理丢失、延时、重复及读错的包。超时机制允许设备监测丢失包并请求重发。
TCP 提供了有效流控制。当向发送者返回确认响应时,接收 TCP 进程就会说明它能接收并保证缓存不会发生溢出的最高序列号。
全双工操作:TCP 进程能够同时发送和接收包。
TCP 中的多路技术:大量同时发生的上层会话能在单个连接上时进行多路复用。
协议结构
| 16 | 32 bit | |||||||
| Source port | Destination port | |||||||
| Sequence number | ||||||||
| Acknowledgement number | ||||||||
| Offset | Reserved | U | A | P | R | S | F | Window |
| Checksum | Urgent pointer | |||||||
| Option + Padding | ||||||||
| Data | ||||||||
- Source Port – 识别上层源处理器接收 TCP 服务的点。
- Destination Port – 识别上层目标处理器接收 TCP 服务的点。
- Sequence Number – 通常指定分配到当前信息中的数据首字节的序号。在连接建立阶段,该字段用于设别传输中的初始序列号。
- Acknowledgment Number – 包含数据包发送端期望接收的数据下一字节的序列号。一旦连接成功,该值会一直被发送。
- Data Offset – 4 位。TCP 协议头中的32位字序号表示数据开始位置。
- Reserved – 6位。预留以备用,必须设置为0。
- Control Bits (Flags) – 6位。传送各种控制信息。控制位可以是:
| U (URG) | Urgent pointer field significant. |
| A (ACK) | Acknowledgment field significant. |
| P (PSH) | Push function. |
| R (RST) | Reset the connection. |
| S (SYN) | Synchronize sequence numbers. |
| F (FIN) | No more data from sender. |
- Window – 16位。指定发送端接收窗口的大小,也就是说,数据可用的八位缓存区大小。
- Checksum – 16 位。指出协议头在传输中是否遭到破坏。
- Urgent Pointer – 16 位。指向数据包中的第一个重要数据字节。
- Option + Padding – 指定各种 TCP 选项。可选项有两种可能形式:单个八位可选类型和八位可选类型,八位可选长度和实际可选数据八位位组。
- Data – 包含上层信息。
相关协议:IP、UDP、ICMP、SNMP、FTP、TELNET、SMTP、RPC、XDR、NFS
组织来源:TCP 由 IETF(http://www.ietf.org)定义在 RFC 793中。
相关链接:
http://www.javvin.com/protocol/rfc793.pdf: TCP Specifications
http://www.javvin.com/protocol/rfc3168.pdf: The Addition of Explicit Congestion Notification (ECN) to IP
http://www.iana.org/assignments/port-numbers: TCP and UDP port numbers


