TCP:字节流、报文段结构、序号与确认号
TCP报文段结构
TCP报文段首部主要包括:
- 源端口号/目的端口号:用于多路复用/分解上层应用的数据。
- 检验和:检测差错。
- 序号/确认号:用于实现可靠数据传输。
- 接收窗口:用于流量控制,指示接收方愿意接受的字节数。
- 首部长度:由于TCP选项字段,首部长度是可变的。通常选项字段为空,所以TCP首部的典型长度为20字节。
- ACK:指示确认字段中的值是有效的。
- RST/SYN/FIN:用于连接建立和拆除。
互动实验
检查TCP首部字段
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
序号与确认号
TCP连接的双方都可以随机选择初始序号,这样可以降低上一条TCP连接残留的报文段被误认为是新连接的报文段的可能性(如果这两个连接恰好使用了同一个端口)。
主机A的确认号是主机A期望从主机B收到的下一字节的序号。因为TCP只确认该流中至第一个丢失字节为止的字节,所以TCP被称为提供累计确认。
Telnet是一个用于远程登录的应用层协议,它运行在TCP之上。假设主机A发起一个与主机B的Telnet会话,主机A的用于键入的每个字符都会被发送给主机B,主机B将回送每个字符的副本给主机A,并将这些字符显示在屏幕上,以确保发送的字符得到了处理。
假设主机A和B的初始序号为42和79,当用户输入一个字符后,这个字符会在网络中传输两次。
知识测验
题目
TCP按序收到Seq=92、8字节数据,下一确认号是多少?
TCP提供字节流,而不是消息边界
TCP按字节编号,报文段的序号是该段首个数据字节的序号。相同的应用字节流可以被分成不同大小的报文段;接收方的读取也不必对应发送方的一次写入。应用应使用长度前缀、分隔符或其他定界规则。
本节回显图从已建立连接的首个数据字节开始。建立连接时SYN消耗一个序号,关闭时FIN也消耗一个;纯ACK不消耗序号。两个传输方向的序号空间相互独立。
互动实验
跨越缺口重组字节流
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
应用向TCP连续写入两份消息,接收方一次recv会保证只返回第一份吗?
动手练习
追踪字节缺口与字符回显
接收方期望92,先收到Seq100,len20,再收到Seq92,len8,最后重复收到Seq92,len8;假设支持失序缓存。求每次ACK与新增可交付字节。另外A下一个数据序号为42、B为79:A发送C,B回显C,A确认。写出三个报文段的Seq/ACK。