面试题-计网:TCP如何保证可靠传输?TCP的流量如何控制?
TCP如何保证可靠传输?
- TCP基于
以字节为单位的滑动窗口来实现可靠传输
- 如何描述发送窗口的状态?(使用三个指针来分别指向相应的字节序号)
- 小于P1的是已发送并已收到确认的部分
- 大于等于P3的是不允许发送的
- P3-P1=发送窗口的尺寸
- P2-P1=已发送但尚未收到确认的字节数
- P3-P2=允许发生但尚未发送的字节数(又称为可用窗口或有效窗口)
- 虽然发送方的发送窗口时根据接收方的接受窗口设置的,但在同一时刻,
发送方的发送窗口并不总是和接收方的接收窗口一样大
- 网络传送窗口值需要经历一定的时间之后,而且这个时间还是不确定的
- 发送方也有可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸
- 如果接收方把不按序到达的数据一律丢弃,那么接受窗口的管理将会比较简单,但这样对网络资源的利用不利,因为发送方会重复传送较多的数据。
- TCP通常对不按序到达的数据是先临时存放在接受窗口中,等到字节流中所缺少的字节到了后,再给到
上层的应用进程
- TCP要求接收方必须有
累计确认和捎带确认机制,减少传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发生时,顺便一起把确认信息带上
接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传,这反而浪费了网络资源。TCP标准规定,确认推迟的时间不应超过0.5s。若收到一连串具有最大长度的报文段,则必须每隔一个报文段发送一个确认[RFC 1122]
- 捎带确认很少发生,大多数应用程序很少同时两个方向上发送数据
- TCP的通信时全双工通信。
- 对于不按序到达的数据应如何处理,TCP并无明确规定
- 总结:
- 校验和:发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
- 编号:TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- 滑动窗口
- 拥塞控制
TCP的流量控制
- 流量控制说白了就是让发送方不要传的那么快,太快了来不及接收
- 利用
滑动窗口可以很方便地在TCP连接上实现对发送方的流量控制

seq=1 DATA:seq取值1,表示TCP报文段数据载荷的第一个字节的序号是1
DATA表示该报文段为TCP数据报文段

ACK:TCP报文段首部中的标志位,取值1表示这是TCP确认报文段
ack:TCP报文段首部中的确认号字段,取值201表示序号201以前都正确接受,等待接受201后的数据
rwnd:TCP报文段首部中的窗口字段,取值300表示,接受窗口改为300
- 只要TCP连接的一方,收到对方的
零窗口通知,就启动一个持续计时器,若超时,就发送一个零窗口探测报文(只携带1字节数据),接收方在收到探测报文段时,给出自己的接收窗口值。若依然是0,就重启计时器。
- 事实上,TCP规定,即使接收窗口为0,也必须接收
零窗口探测报文段、确认报文段、带有紧急数据的报文段。
零窗口探测报文段也有重传计时器,超时就重传。