本文内容:
- 复用TCP报文段里的序列号部分?
- 发送数据长度如何确定,发送方怎么知道自己该发哪些字节了?
- 正常发送数据时应该用哪个标识
- TCP报文段里的头部长度的作用何在?
- TCP头里的关键项和作用
疑惑1:复用TCP报文段里的序列号部分?
TCP通过字节序列号+确认机制来保证数据不丢失,接收方每接收一个报文段,就要发回一个ACK确认段,TCP报文头里有序列号 和 确认序列号,
那么为什么不复用序列号这部分呢,通过ACK标识位来判断是发送时的序列号还是ACK确认序列号?这样就能一个报文段减少4字节
理解:确认和发送合并,TCP是双工通信,一方在接收数据的同时也可能在发送数据,这样设计就能将对接收报文段的确认与自己要发的数据合并到一个报文段里(节约一个报文头)
疑惑2:发送数据长度如何确定,发送方怎么知道自己该发哪些字节了?
TCP报文段里,固定头是定长,选项里有指定长度,两个里面都没有关于数据部分长度的信息,那么发送方如何确认自己该发哪些信息了呢?
理解:数据长度是由接收方统计,ACK确认序列号是接收方期待下次接收的序列号,并不是它此次接收的序列号,所以发送方可以根据ACK确认序列号知道自己该发哪些字节
https://bbs.csdn.net/topics/70486134 boxman TCP数据长度 = IP包总长度(IP首部里)- IP首部长度(IP首部里)- TCP首部长度
疑惑3:TCP的6个特殊标识里,除了ACK其他好像都是特殊情况,那么正常发送数据时应该用哪个标识呢?
理解:任何标识符的报文都可能也在发送数据,比如说,没有标识就是正常发送数据,只有ACK标识 表示是发送数据+确认接收的数据,其他标识也可能附带着发送数据
疑惑4:TCP报文段里的头部长度的作用何在?
TCP头分为固定长度20byte + 选项长度,每个选项有自己的选项长度,这就可以计算出头部长度了,保存这个长度用来做什么?
猜测:
- 用来计算数据的起始位置,用来紧急情况下跳过选项直接访问数据?
- 限制TCP头中选项的长度
注:哪位大佬帮忙解个惑,/拜谢
附上几个TCP头里的关键项和作用
- 确认序列号
- 接收方期待下次接收的序列号,而不是它实际接收的序列号,发送方可以靠它来知道自己该发哪些数据了
- 作用:让接收方知道接下来该发哪些字节了,发送长度由同时发出的窗口大小段决定
- 窗口大小
- 接收窗口大小,指自己TCP接收缓冲区还能容纳多少字节的数据
- 作用:流量控制
- 校验和
- 对TCP报文头和数据计算出一个数
- 作用:数据传输过程是否损坏检测,保证可靠性
- 头部长度
- 表示TCP头部总共占多少个32bit,该字段有4bit(0-15),所以TCP头的最大长度是15*4byte = 60 byte,固定部分是20byte,选项最多40byte
- 作用:
- MSS选项头:
- Max Segment Size,指每次能够传输的最大数据分段长度(一般等于IP层的最大传输单元MTU)
- 作用:避免IP分片
- 由于IP层不提供超时重传,如果TCP不自己分段,那么传到IP层,IP层会根据MTU进行IP分片,这样如果某个分片丢失就会导致整个TCP报文得重传
所以TCP自己分段,就能出现丢失时只对一段进行重传
- 由于IP层不提供超时重传,如果TCP不自己分段,那么传到IP层,IP层会根据MTU进行IP分片,这样如果某个分片丢失就会导致整个TCP报文得重传
还有几点自己以前老是记错的点,记下来提醒自己注意
- TCP报文段里只有 端口号,没有IP,IP地址是传到IP层时带上的
学习自
Linux高性能服务器编程