文章目录
TCP的特点
TCP的主要特点
- 面向连接:通信前需建立连接,通信后需释放连接
- 点对点通信:每条TCP连接只有两个端点
- 可靠交付:确保数据正确、完整、有序到达
- 全双工通信:双方可同时发送和接收数据
- 面向字节流:数据被视为无结构的字节序列
- TCP 中的"流"(stream) 指的是流入或流出进程的字节序列
- 面向字节流:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流

面向字节流
- TCP将应用层交下来的数据看作字节流
- 不保留应用层数据的边界
- 接收方可能一次收到多个应用层数据块,也可能一个数据块分多次收到


TCP如何实现可靠传输
- 理想传输条件的特点
- 传输信道不产生差错
- 不管发送方以多快的速度发送数据, 接收方总是来得及处理收到的数据
- 在理想传输条件下,不需要采取任何措施就能够实现可靠传输
- 但实际网络都不具备理想传输条件,必须使用一些可靠传输协议 ,在不可靠的传输信道实现可靠传输
停止等待协议
工作方式
- 每发送完一个分组就停止发送, 等待对方的确认
- 在收到确认后再发送下一个分组
- 全双工通信的双方既是发送方也是接收方
- 假设仅考虑 A 发送数据, 而 B 接收数据并发送确认 ,因此 A 叫做发送方, 而 B 叫做接收方

差错处理


流水线传输
- 提高传输效率

连续ARQ协议
发送窗口滑动
- 发送窗口滑动:发送方每收到一个确认, 就把发送窗口向前滑动一个分组的位置

累积确认
- 累积确认:接收方对按序到达的最后一个分组发送确认, 表示:到这个分组为止的所有分组都已正确收到了

TCP报文首部格式

- 源端口和目的端口
- 源端口和目的端口各占 2 字节
- 端口是传输层与应用层的服务接口
- 序号
- 序号占 4 字节。
- TCP 连接中传送的数据流中的每一个字节都有一个序号
- 序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
- 确认号
- 占 4 字节, 是期望收到对方的下一个报文段的数据的第一个字节的序号
- 数据偏移
- 即首部长度,占 4 位, 指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远
- 单位是 32 位字( 以 4 字节为计算单位)
- 保留
- 占 6 位 ,保留为今后使用 ,但目前应置为 0
- 紧急 URG
- 控制位
- 当 URG = 1 时, 表明紧急指针字段有效, 告诉系统此报文段中有紧急数据, 应尽快传送 (相当于高优先级的数据)
- 确认 ACK
- 控制位
- 只有当 ACK =1 时, 确认号字段才有效
- 当 ACK =0 时, 确认号无效
- 推送 PSH (PuSH)
- 控制位
- 接收 TCP 收到 PSH = 1 的报文段后, 就尽快( 即 "推送" 向前) 交付接收应用进程, 而不再等到整个缓存都填满后再交付
- 复位 RST (ReSeT)
- 控制位
- 当 RST=1 时, 表明 TCP 连接中出现严重差错( 如主机崩溃或其他原因), 必须释放连接, 然后再重新建立运输连接
- 同步 SYN (SYNchronization)
- 控制位
- 同步 SYN = 1 表示这是一个连接请求或连接接受报文
- 当 SYN = 1 ,ACK = 0 时, 表明这是一个连接请求报文段
- 当 SYN = 1 ,ACK = 1 时, 表明这是一个连接接受报文段
- 终止 FIN (FINish)
- 控制位
- 用来释放一个连接
- FIN=1 表明此报文段的发送端的数据已发送完毕, 并要求释放运输连接
- 窗口
- 占 2 字节
- 窗口值告诉对方:从本报文段首部中的确认号算起, 接收方目前允许对方发送的数据量( 以字节为单位)
- 检验和
* 占 2 字节
* 检验和字段检验的范围包括首部和数据这两部分 - 紧急指针
- 占 2 字节
- 在 URG = 1时, 指出本报文段中的紧急数据的字节数( 紧急数据结束后就是普通数据), 指出了紧急数据的末尾在报文段中的位置
- 选项
- 长度可变, 最长可达 40 字节
- 最大报文段长度 MSS
- 窗口扩大
- 时间戳
- 长度可变, 最长可达 40 字节
- 填充
- 使整个 TCP 首部长度是 4 字节的整数倍
- 最大报文段长度 MSS
- 最大报文段长度 MSS (Maximum Segment Size) 是每个 TCP 报文段中的数据字段的最大长度MSS
- 告诉对方 TCP:"我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节 。"
- 窗口扩大
- TCP 窗口字段长度= 16 位, 最大窗口大小 = 64 K 字节
- 对于传播时延和带宽都很大的网络, 为获得高吞吐率较, 需要更大的窗口
- 时间戳
- 序号重复时, 为了使接收方能够把新报文段和迟到很久的旧报文段区分开, 可以在报文段中加上时间戳