TCP面向连接协议,为应用程序提供可靠传输(传输时必须建立一种连接关系)
面向连接:即应用程序在决定使用TCP作为四层封装的时,数据传输前要先通过“三次握手”机制。
可靠传输:即在TCP会话建立好后,通过使用TCP内部的各种机制保证数据传输的可靠性。
TCP报文解析:
端口号:用于标识该数据由哪种应用程序发,哪种应用程序收
序号:防止分片乱序(防止网络传输过程中不同分片由于网络延迟而导致接收顺序错乱)
确认序号:确认收到对端发来的TCP报文(每次收到后,在报文序列号基础上+1回复)
部首长度:通常20字节(由于有个可变长度的选项和填充项,长度范围实际在20~60字节不等[要满足能被4整除,不够填充项补充])
保留位:全为0,没人用,可忽略
标志位:涵盖六个控制信息
[1]URG紧急位:表希望紧急处理该TCP的连接
[2]SYN同步位 & [3]ACK确认位:于TCP建立会话时三次握手使用
[4]PSH推动位:=1:表接收报文发生拥塞后,不需要排队,加急处理报文
[5]RST复位位:重置TCP连接
[6]FIN终止位:表TCP会话结束,终止TCP连接
窗口大小:TCP每一次传输的数据量。即为防止使用TCP应用传输数据时因网速过快导致网络拥塞,双方在发送数据前做的一个协商的预留空间。
window滑动窗口机制:根据接收方接受数据的能力,调整发送数据的窗口大小
根据接收方接收数据的能力,调整发送数据的窗口大小。
校验和:校验整个TCP报文(报头和数据)
紧急指针:=1,优先处理该TCP连接(且标志位URG紧急位也必须=1才生效)
三次握手(面向连接):
(ack=seq+1;ack'=seq+ack;)
举个栗子:(x+2:序列号)(假设数据500bit)
A传输三段数据: [1]seq=x+2; [2]seq=(x+2)+500; [3](x+2)+1000;
→接收方B 若回复的ack=(x+2)+1000+1;则数据接收正常。
若回复的ack=(x+2)+500+1;则代表接收异常,
届时无论之后的分片是否接收正常,都会从丢失的分片开始重传。
可靠性(可靠传输)≠安全:
1:通过sequence number序号字段对分片进行标号
2:通过确认机制防止丢包
3:通过window窗口滑动窗口机制防拥塞做流控
4:通过校验和检查数据完整性,防止报头被篡改
5:通过重传机制丢包了重传,保障了传输的可靠性
UDP面向非连接协议,不可靠传输(传输时无需建立连接关系)
没有sequence和acknowledgement所以无法确定一个可靠的连接关系,因此基于udp的应用层app发送数据时,不需要考虑建立连接关系,只负责发送数据即可。
UDP报文解析:
端口号:用于标识该数据由哪种应用程序发,哪种应用程序收
长度:8bit定长(包括报头和数据的整个数据段长度)
校验和:用于满足报头长度被4整除,多余(UDP没有重传机制,发现报文错误直接丢弃)
UDP和TCP相比它的优点
1.报头小:UDP长度8bit,不占用宽带,TCP至少20bit;
2.速度快:不需要三次握手四次握手,直接传;
3.效率高:不需要等待对端确认;
4.支持的应用类型更广泛:因为没有那么多可靠机制的限制,所以UDP既可以单播,也可以组播传输;
5.没有重传机制:有好有坏,如语音、视频这些场合重传了声音画面叠加,反而影响效果;
6.不用担心基于三次握手的各种攻击(例如TCP的SYN泛洪攻击):黑客只完成一/两次握手,不完成三次握手,服务器便会处于半开连接状态,加上TCP协议本身没有任何计时器限制超时,只要黑客愿意,连接就永远存在。利用这点,黑客可以建立无数个连接,直到耗尽服务器资源,导致程序宕机;
注:UDP协议通常会配合RTP协议结合使用
RTP实时传输协议:报文长度12bit,包含序列号字段,可以让UDP的数据分片按正常顺序重组。