TCP协议段格式:
如图,
端口号:
是其中一个重要的部分,知道端口号才能确认数据交给哪个应用程序(端口号属于传输层的概念).
4位首部长度:4bit表示的范围是0->15,在此处,单位是"4字节",因此,将这里的数值 * 4,才是真正的报头长度,即TCP 报头最大长度,60 字节.
TCP 报头的前 20 个字节,是固定的.(TCP 报头的最短长度,20 字节)选项部分,可以有,也可以没有.可以有一个选项,也可以有多个选项.需要用首部长度,确认报头到哪结束,载荷数据从哪开始.
保留(6位):
现在不用,先占个位置,以防后面需要用(目前 tcp 也这么多年,大概率是不用了)
其实也就是给未来留下了可以升级扩展的空间.
TCP特点:
有连接,可靠传输(内核实现的 可靠传输,写代码的时候,是感知不到的),面向字节流,全双工
可靠传输实现机制
确认应答(保证"可靠性"最核心的机制)
在TCP的可靠传输机制中,“确认应答”(Acknowledgment)是一种用于确认数据的机制。发送方发送数据段给接收方后,接收方会发送一个特殊的确认应答段(ACK)来告知发送方已经成功接收到数据.
工作原理:
发送方发送数据段:发送方将数据分成一个或多个数据段,并通过TCP协议将这些数据段发送到接收方。
接收方接收数据段:接收方收到数据段后,会对数据进行校验,检查数据的完整性和是否有错误。
发送确认应答:如果数据段没有错误,接收方会发送一个确认应答段(ACK),该段中包含了接收到的数据段的序列号,通知发送方数据已成功接收。
发送方处理确认应答:发送方收到确认应答后,会更新发送窗口的状态,并根据接收方提供的确认应答信息进行相应处理,如确认成功发送的数据段、启动定时器等。
超时重传:如果发送方在指定的时间内未收到确认应答,它会认为该数据段丢失或损坏,触发超时重传机制。发送方会重新发送未收到确认应答的数据段,以确保数据的可靠传输。
后发先至
当连续发多条数据的时候,可能会出现"后发先至"的情况,即一个数据报,是先发的另一个是后发的后发的反而先到了(由于网络的延迟、拥塞或丢包等原因,可能会导致部分数据段的顺序被打乱,即后收到的数据段可能先到达接收方)
如何解决呢?
对数据进行编号
确认序号的数值,就是收到的最后一个字节的编号再加一.
注意:TCP是面向字节流的,不是按照“条”为单位来传输.
只要知道这一串字节的开始编号,以及数据的长度每个字节的编号自然也就知道了
只需要在 tcp 报头中,把这-串字节第一个字节的编号,表示出来再结合报文长度,此时每个字节的编号就确定了
ACK 为 0 表示这是一个普通的报文,此时只有 32 位序号是有效的.ACK为 1,表示这是一个应答报文,这个报文的 序号 和 确认序号 都是有效的
如此就有办法能区分出,当前这个报文是普通报文,还是一个确认应答报文
超时重传:
确认应答,是 TCP 保证可靠性的最核心机制
超时重传,也是 TCP 可靠性机制的有效补充
丢包,在网络上很可能出现,发一个数据, 然后丢了.
路由器/交换机 就是交通枢纽
结构复杂,传输的数据量也是不确定这一会传输的数据比较少过一会数据就很多了
如果设备太繁忙了,后面新来的数据等太久了就可能被丢弃了网络负载越高,越繁忙就越容易丢包
丢包有两种情况如图:
发送方无法区分哪种情况,既然无法区分,那就全都重传
丢包本质上是一个“概率性”问题
假设丢包的概率是 10%,传输成功的概率是 90%
连续两次传输,都丢包的概率是多少?
10%*10% =>1%
随着你重传次数的增加,总体能够传输成功的概率,是更大的
是否会存在,连续重传多次,仍然丢包呢?当然存在!! 如果当前的丢包概率已经极高了,达到 100%(比如网线断了),不管咋传,都是丢的
连接管理:
1.建立连接(三次握手)
2.断开连接(四次握手)
握手: handshake,使用打招呼来触发“特定场景
发一个打招呼的数据(这个数据并不会携带业务信息)
A和 B 完成建立连接的过程,就需要
文样的打招呼的数据交互
为什么要合并呢?封装和分用
合并之后,节省了封装和分用的过程降低了成本,提高了效率原则,能合并就合并
六个标志位说明总结:
SYN(Synchronize):表示建立连接。在TCP的三次握手过程中,用于建立连接的第一个数据段会将SYN标志位设置为1。当接收方收到带有SYN标志位的数据段时,它会发送一个带有ACK和SYN标志位的确认应答段,用于确认连接并建立双向通信。
ACK(Acknowledgment):表示确认。在TCP的确认应答中,ACK标志位用于确认成功接收到数据。它通常与其他标志位一起使用,如SYN、FIN等。
FIN(Finish):表示关闭连接。在TCP的四次握手过程中,用于关闭连接的数据段会将FIN标志位设置为1。当一方发送带有FIN标志位的数据段时,它表示已经完成数据传输,请求关闭连接。另一方收到后会发送一个确认应答,并执行相应的关闭操作。
RST(Reset):表示连接复位。当TCP遇到一些异常情况时,如收到无效的数据段或遇到网络故障,会发送带有RST标志位的数据段来中断连接。RST标志位可以用于快速中止连接,恢复到初始状态。
PSH(Push):表示立即推送数据。当发送方设置PSH标志位时,接收方会尽快将数据交给应用程序处理,而不是等待缓存区填满或等待延迟确认。
URG(Urgent):表示紧急数据。当发送方希望发送的数据段中有紧急数据要传输时,可以将URG标志位设置为1。接收方在收到含有URG标志位的数据段后,会尽快处理该数据,以便应用程序能够及时处理。