UDP协议
前言
昨天晚上做了一晚上的噩梦,可把我吓坏了,唉!做恶梦不好,睡不好啊.这几天咱们差不多一起学了物理层,链接层和网络层.最开始的链接层协议种类繁多(Ethernet,Wifi,ARP等等).到了网络层,我们只剩下一个IP协议(IPV4和IPV6是替代关系).进入了传输层,协议的种类又开始繁多起来(比如TCP,UDP,SCTP等).这就好像下面的大树,根部(链接层)分叉多,然后统一到一个树干(网络层),到了树冠(传输层)部分又开始分叉,而每个树枝上长出更多的树叶(应用层).我们在网络层已经看到,通过树干的统一,我们实现了一个覆盖全球的互联网络.然后,我们可能处于不同的目的利用这张”网”,随之使用的方式也有所区别.不同的传输层协议(以及更多的应用层协议)正是我们使用”网”的不同方式的体现.
引入
传输层最重要的协议为TCP协议和UDP协议.这两者使用”网”的方式走了两个极端.两个协议的对比非常有趣.TCP协议复杂,但传输可靠.UDP简单,但传输不可靠.其他的各个传输层协议在某种程度上都是这两个协议的折中,,我们来看看传输层协议中比较简单的UDP协议.
UDP协议简介
UDP(User Datagram Protocol)传输与IP传输非常类似,你可以将UDP协议看做是IP协议暴露在传输层的一个接口.UDP协议同样以数据包的方式传输,它的传输方式也是”Best Effort”的,所以UDP协议也是不可靠的.那么我们为什么不直接使用IP协议而要额外增加一个UDP协议呢?一个重要的原因是IP协议中并没有端口的概念,IP协议进行的是IP地址到IP地址的传输,这意味着两台计算机之间的通话.但是每台计算机中需要多个通信通道,并将多个通信通道分配给不同的进程使用.一个端口就代表了这样的一个通信通道.正如我们在前面说到的一样.UDP协议实现了端口,从而让数据包可以在发送到IP地址的基础上,进一步可以送到某个端口.
尽管UDP协议非常简单,但它的产生晚于更复杂的TCP协议.早期的网络开发者开发出IP协议的TCP协议分别位于网络层和传输层,所有的通信都要先经过TCP封装,再经过IP封装(应用层->TCP->IP).开发者将TCP/IP视为互相合作的套装.但很快,网络开发者发现,IP协议的功能和TCP协议的功能相互独立的.对于一些简单的通信,我们只需要”Best Effort”式的IP传输就可以了,而不需要TCP协议复杂的建立连接的方式(特别是早期的网络环境中,如果过多的TCP连接,会造成很大的网络负担,而UDP协议可以相对快速的粗理这些简单通信).UDP协议随之就被开发出来,作为IP协议在传输层的”傀儡”.这样,网络通信可以通过应用程->UDP->IP的封装方式.绕过TCP协议,由于UDP协议本身异常简单,实际上只为IP传输起到了桥梁的作用.我们将在TCP协议的讲解中看到更多的TCP和UDP协议的对比.
UDP的数据包同样分为头部(header)和数据(payload)两部分.UDP是传输层协议,这意味着UDP的数据包需要经过IP协议的封装,然后通过IP协议传输到目的电脑.随后UDP包在目的电脑拆封,并将信息送到相应端口的缓存中.
UDP协议的头部
上面的source port 和 destination port分别是UDP包的出发端口和目的端口.Length为整个UDP包的长度.
Checksum的算法头部与IP协议的header checksum算法相类似.然而,UDP的checksum所校验的序列包括了整个UDP数据包,以及封装的IP头部的一些信息(主要为出发地IP和目的地IP).这样,checksum就可以校验IP:端口的正确性可.在IPv4中,checksum可以为0,这意味着不使用checksum.IPV6要求必须进行checksum校验.
端口与socket
端口(port)是伴随着传输层诞生的概念.它可以将网络层的IP通信分送到各个通信通道.UDP协议和TCP协议尽管唉工作方式上有很大的区别.但它们都建立了从一个端口到另一个端口的通信.
IP:端口
随着我们进入传输层,我们也可以调用OS中的API,来构建socket.Socket是OS提供的一个编程接口,它用来代表某个网络通信.应用程序通过socket来调用系统内核中处理网络协议的模块,而这些内核模块会负责具体的网络协议的实施.这样,我们可以让内核来接受网络协议的细节,而我们只需要提供所要传输的内容就可以了,内核会帮我们控制格式,并进一步向底层封装.因此,在实际应用中,我们并不需要知道具体怎么构成一个UDP包,而只需要提供相关信息(比如IP地址,比如端口号,比如索要传输的信息),OS内核会在传输之前根据我们提供的相关信息构成一个合格的UDP包(以及下层的包和帧).socket是一个比较大的课题,咱们不研究.
总结
端口是传输层带来的最重要的概念.我们进一步了解了UDP协议,如果已经掌握了IP协议,那么UDP协议就没有任何困难了,它只是IP协议暴露在传输层上的接口.