TCP/UDP报文格式及各种通信机制简介
一、UDP报文
UDP报文结构如下图所示:
UDP报文中包含 :(1) 16位源端口和目的端口,用于表示自己的端口号和将要发送的目的端口号。 (2) 16位UDP长度,表示8字节报头和UDP数据的总长度,用于确定报文长度。 (3) 16位校验和,用于在接收端对比校验,确定接收的UDP报文是否有错。(4) UDP数据信息。
UDP特点:(1) 无连接,UDP直接通过IP和端口号通信,不需要建立链接。(2) 面向数据报,不能够灵活的控制读写数据的次数和数量。发送的数据会被一次全部发送或接收比如要发100个字节,就只能一次把100字节全部发送,接收也只能一次接100个字节,并且报文不保证按序接收,缓冲区满了就不接收报文,这也是不可靠的原因。(3) 不可靠传输,没有确认机制;如果发送故障,UDP协议层也不会给应用层返回任何错误信息。只发送数据,不负责校验,但是协议简单。
二、TCP报文
TCP报文结构如下图所示:
TCP报文中包含 :(1) 16位源端口和目的端口。 (2) 32位序号,给报文序号,保证报文有序,可提高可靠性。 (3) 32位确认序号,当接收端收到发送端报文后,需要给发送端回复一个确认应答的报文,告诉发送端自己收到上一条信号,并且确认序号=发送端报文序号+1。(4) 4位首部长度,用于确定报头长度,假如是“1111”,则报头长度为4x15=60。(5) SYN标志位,在TCP建立连接也就是三次握手时,建立连接方SYN标志位置1。(6) ACK标志位,接收端接收到发送端的报文时,需要给发送端确认应答,告诉发送方报文已收到。(7) PSH标志位,提醒接收端尽快把缓冲区的数据读取。(8) RST标志位,链接建立异常,重新建立连接。在三次握手时,最后一次发送端发送ACK,发送端认为自己建立链接成功,接收端接收到ACK确认建立链接,如果接收端ACK丢失,发送端以为完成建立链接,接收端认为还没有,发送端后面发送信息,接收端返回RST。(9) FIN标志位,在断开连接时,FIN置1。(10) URG标志位,正常情况下,TCP报文都是按序发送,接收端按序接收,但是如果其中有个报文优先级比较高,则可以通过URG+16位紧急指针进行优先读取。(11) 16位紧急指针,标识那部分是紧急数据,确定紧急数据在报文中的偏移量。(12) 16位窗口大小,为了防止接收方缓冲区快速被填满,需要流量控制,用窗口大小表示自身的接收缓冲区的剩余空间大小,对方根据剩余缓冲区大小调制发送接收速度。(13) 16位校验和,检验数据是否有错。(14) 选项,选项大小=首部长度确定的报头长度-20个固定字节。(15) 数据。
TCP特点:(1) 有连接,通信需要建立链接。(2) 面向字节流,发送接收端可将报文分多次发送,可以一次读写若干字节,也可以一次全读写完。(3) 可靠传输,有确认应答,超时重传,流量控制,拥塞控制等机制保证TCP报文可靠性传输。
三、TCP通信机制
1,确认应答机制
发送端在发送数据后,接收端收到发送端数据,就需要给发送端一个应答报文其中ACK置1并且确认序号为是一个报文序号+1,告诉发送端上一个报文我们收到了,并且下一个报文你可以按确认序号开始往后标号。如发送端发送数据1-1000,接收端返回ACK并且确认序号为1001。
2,超时重传机制
如果我们发送端发送一个数据后,等待一定时间没有收到接收端返回的应答报文,那么我们就认为上一个发送的报文丢失了,接收端没有收到,我们就需要重新发送。在LIUNX中第一次等待500ms,第二次2x500ms,第三次3x500ms.后面类推。
3,滑动窗口及快重传机制
发送端一次发送窗口大小的数据,暂时不用管ACK,后续收到对方的ACK时窗口移动,继续发送数据。滑动窗口大小受16位窗口大小和拥塞窗口控制,并且收到ACK后,滑动窗口不一定滑动,有3种情况:
(1) 发送端收到ACK,窗口滑动。
(2) 发送端收到ACK,但接收端缓冲区满,接收不了数据了,窗口不滑动,窗口变小。
(3) 发送端收到ACK,但接收端接收数据的能力大量,窗口滑动,并且变大。
滑动窗口丢包情况:
(1) ACK丢了:数据包到了接收端,接收端会对每个字段的数据回复一个ACK,如果窗口之间由一个字段的ACK没收到无所谓,可以通过后续的字段的ACK确认也可以。
(2) 数据包丢了:窗口之间的某个字段的包丢了,后续的确认ACK,只能收到丢包之前的确认序号和ACK,当收到3次重复的确认应答,需要重新发丢包的字段,然后接收端发送后续字段的确认应答,如果后面仍然丢包,重复上述操作,如果后续的数据都收到了,直接回复最后一个字段的确认应答ACK(快重传机制)
有超时重传为什么还需要快重传?
因为如果后续的数据字段不够3个,就无法收到三个同样的ACK,就无法进行快重传,就只能进行> 超时重传机制,超时重传机制是保底机制
4,流量控制
流量控制是网络防止发送数据过多导致接收端缓冲区满了,收不下数据而丢包,因此发收数据必须适配,进行流量控制,通过16位窗口大小控制流量,存放接收缓冲区的大小,发送给对方,进行流量控制。
5,拥塞控制及慢启动机制
当网络中出现大量丢包现象时,网络可能出现拥塞,此时我们不能直接重传数据,不能加重拥塞问题,应该尽量不发或少发数据,等网络恢复再正常发送。 此时我们因先等待一段时间,后面需要引入慢启动机制:先发少量数据,检测是否收到ACK,收到ACK后,可以慢慢恢复数据量。而此时我们需引入一个概念,拥塞窗口:他一个数字,表示可能引发拥塞的阈值,发送的数据量大于拥塞窗口, 可能引发网络拥塞问题,拥塞窗口的数值不是确定的,根据网络状况而定,每台主机都要有拥塞窗口,且拥塞窗口不一样,并且我们可以用拥塞窗口进行控制滑动窗口大小。拥塞窗口以指数增长(2^n),指数增长达到通信阈值后就以线性方式增长并且达到正常通信阶段。
6,延迟应答
接收端不急着应答,然后上层可能会取走更多缓冲区的数据,使得下次更新窗口时使滑动窗口变大提高吞吐量,实现速率提升。
7,捎带应答
发送确认ACK时,也捎带发送数据一起发送过去,既有确认功能也有发送功能。
8,粘包问题
在接收端读取报文时,一个报文被读了一部分,或者把旁边的报文也读取了一部分,而导致读取的报文不完整,就不能直接用。如同拿一个包子,包子黏在一起,取包的时候把旁边的包子也撕下来一点,照成包子不完整,因此包子与包子之间要有边界,不能连在一起,故报文与报文之间也要有边界,我们可以通过如下几个方法区分报文:1,定长报文 。2,特殊字符。 3,自描述(读取前几个字节,这几个字节中确定有效载荷长度)+定长。 4,自描述+特殊字符(空行)UDP的长度都是固定的,不存在粘包。