1. TCP 概述
-
TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接); 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
-
TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
-
TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
-
面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
2. TCP 报文格式
原端口号
2 byte
目的端口号
2 byte
序号
4 byte
用来确认发送的数据字节流序号,序号达到 2^32 - 1后又从 0 开始。
确认序号
4 byte
发送确认的一端期望收到的下一个序号,在确认标志位 ACK = 1 时有效
数据偏移
4 bit
指出TCP 报文段的数据距离 起始处有多远,单位为 32 bit 字,又称 首部长度。
由于只有 4 bit,故最大值表示 15,15*32bit/8 = 60 byte,所以 TCP 首部长度最大可为 60 byte,由于固定首部的存在,首部偏移最小为 20 byte,所以选项长度不能超过 40 byte。
保留
6 bit 也有说 3 bit 4 bit,主要是标志位的不同导致,先不纠结。
标志位
- NS-ECN-nonce,标明阻塞即将发生
- CWR,Congestion Window Reduced
- ECE,ECN-Echo 有两种意思,取决于 SYN 标志的值
- URG 紧急,告知系统需要尽快发送,而不是排队
- ACK 确认,ACK = 1 时,上面的确认序号有效。TCP 规定连接建立后 ACK 必须为 1
- PSH 推送,把报文推送给另一方
- RST 复位,TCP 连接出现错误,需要重新连接。也可以用于拒绝一个非法报文或者拒绝打开连接
- SYN 同步,用于建立连接时同步序号
- FIN 终止,释放连接
窗口大小
2 byte
从确认号开始,本报文发送方可以接收的字节数。用于流量控制
2 byte 能表示的最大正整数为 65535,也就是窗口最大值为 65535
校验和
2 byte
检验和覆盖整个