首先来了解一下什么是运输层,其实真正运输数据的是网络层,但是运输层是让端与端之间的不同进程提供了逻辑通讯,就像在一个主机上运行一样。其中主要就是两个协议TCP和UDP
多路分解和多路复用
不管tcp还是udp,在运输层就会实现多路复用和多路分解。我们有很多的进程都需要发送数据到网络同时也有很多进程需要接受数据,这时候为了区分这些进程,我们就使用了一种叫socket的套接字,套接字将数据传输到网络中,一个主机将数据通过不同的套接字收集数据并发送到网络的技术就是多路复用,而在接收端通过首部发送给不同的套接字的技术就是多路分解。而这种实现就是靠端口号,一个报文段中有16位的源端口号和16位的目标端口号。其中0-1023是约定俗成的端口号,比如常用的http是80端口。
UDP的多路复用和多路分解
首先肯定我们还是需要目标端口和源端口的,UDP通过套接字将数据发送到网络层之后靠网络尽力的发送到目标主机,到达主机后通过目标端口分发给特定的套接字。 下面很重要!!! UDP的套接字通过目标IP和目标端口来区分,也就是不同的主机发送有相同的目标IP和目标端口就会到相同的套接字。
TCP的多路复用和多路分解
其中tcp是面向连接的所以它的套接字不只有目标端口和目标IP,而且有源IP和源端口。这样当有不同的源端口或者源IP来到相同的目标IP和目标端口时就会被分配到不同的套接字。这样后续的数据都会根据不同的源端口和源IP分配到不同的套接字中,也就是相当于建立了一条连接。
UDP
前面也讲了UPD就是面向无连接的传输协议。最简单来说就是它几乎就没有比IP协议增加什么功能,还不保证任何数据的可靠性。但是它也有一些有点,最突出的就是它是面向无连接的,减少了建立连接的资源消耗和时间。DNS是建立在UDP上就是看中了这个有点。而且它不像TCP有拥赛控制,它不会受到网络状态的影响而减少发送速度,这在视频会议之类中很有用处。
报文结构

UDP的报文包括我们所说多路复用和多路分解所需要的源端口和目标端口,接下来是报文长度和检验和,我们知道UDP是不靠谱的,它不能保证数据的可靠性,那我们就需要知道发送过来的数据到底对不对,报文长度和检验和就是来检验接受到的数据对还是不对。
检验和
它是将所有的数据每16个字节的和进行反码操作得出。具体计算可以看这篇博客。
https://seanwangjs.github.io/2017/10/19/udp-protocol-checksum.html
但是UDP也就提供了告诉你数据有错而丢弃报文,并没能力恢复数据。
