计算机网络之UDP和TCP

传输层

总线形以太网交换式以太网无线局域网中,我们学习MAC帧在不同的网络中传输的过程,这些功能都是通过物理层和数据链路层(七层参考结构)完成的,而在网络互连与IP中,我们了解了IP分组在终端之间的传输过程,这一层主要是由网络层的各种协议来完成的,现在我们要了解两个重要的协议TCP和UDP,而TCP和UDP是在传输层中两个重要的协议,特别是TCP,许多上层的协议都是建立在TCP协议之上的,比如我们熟知的HTTP协议。传输层中的TCP协议在整个网络体系结构中也扮演着重要的角色,它控制终端和终端数据传输的差错控制、拥塞控制和进程标识的功能

传输层服务特性

传输层是为应用层提供服务的(TCP/IP体系结构),根据应用层提供的数据,传输层给应用层提供了两类不同的服务,一类是面向字节流的服务,另一类是面向报文的服务。对于面向字节流的服务,应用层给传输层提供的数据是一串无结构的字节流,传输层可以对字节流进行分段,对数据没有长度的要求。而对于面向报文的服务,应用层是提供的一些列报文,传输层不对报文进行分割(接收端也不进行封装),但是报文的长度是受限制的。因此对于应用层来说,面向字节流的传输任务最轻,因为只需要将需要传输的字节流交给传输层就可以了,而它面对报文传输的工作就较重,因为他需要将报文进行分割或封装等处理,比如视频的传输,发送端需要将视频进行分割成报文,然后通过UDP协议发送,然后接收端在应用层接受到这些报文以后还需要将报文组装成原始的视频。另外传输层还提供面向连接和无连接的服务,面向连接是的服务是指发送端的传输层和接收端的传输层开始数据传输前需要相互协调,如:

  1. 需要确定双方是否就绪:终端是否在线等
  2. 双方需要分配一些资源:发送端的发送缓冲区;接收端的接受缓冲区
  3. 双方需要协商一些参数

面向连接的服务是提供发送端到接收端按序、可靠的服务,比如应用层提供给传输成的数据时按照1、2、3、4依次顺序的数据,那么在接收到的传输层也需要按照这个顺序将数据提供给应用层。而对于面向无连接的服务,发送端和接收端传输层开始传输数据之前没有协调的过程,而且无连接的服务是不按序和不可靠的服务。由于面向连接的服务传输数据之前需要相互协调,因此需要建立连接,而结束以后需要释放连接,以释放发送端和接收端在传输过程中建立的资源。而面向无连接的服务不需要建立和释放连接的过程。在传输层中的TCP属于面向连接和字节流的服务,而UDP的面向无连接和报文的服务

传输层连接和其他层连接的区别

也就是传输的连接和其他层的连接是相互配合来工作的

端口号

网络互连与IP总线形以太网中我们学习了IP地址和MAC地址,他们的作用是不同网络之间和同一个网之间标识不同的终端,而端口则是在同一个终端中,标识不同进程的标识。端口是用16位二进制位来标识不同的进程,用48位IP地址和16位端口号合成在一起形成一个插口,插口就确定了互联网中某个终端的某个进程。端口号由一个统一的机构来分配的,这个机构叫着互联网数字分配机构IANA,端口号可以分为三种不同的类型:

  • 著名端口号:用来标识Intertnet提供服务进程的端口号,从0-1023
  • 注册端口号:标识不同企业或者机构应用到的进程,从1024-49151
  • 临时端口号:临时进程使用,进程和端口关联是动态的,49152-65535

UDP

服务特性和功能

由UDP提供的功能可知,UDP需要在应用层提供的数据之上加上一些控制信息:

传输层在应用层提供的数据之上加上了端口号用于标识不同的进程,用长度标识了整个首部和数据的长度,用检验和检验整个首部和数据是否出错,而在IP分组中,我们IP分组的首部也有检验和,但是它只是对首部的检验,而不是对真个IP分组的检验,为什么IP分组首部检验和不是对整个数据检验呢?主要是因为IP分组实在网络传输过程会被很多设备检验,如果是对整个数据进行检验,效率会很低,而我们的UDP数据的检验是在发动端和接收端才需要检验,所以它的检验不会加大数据对网络传输过程中的负担

UDP的应用

数据传输的实时性比数据传输的可靠性重要

例如网络语音通信,为了提高通话质量,如果某个UDP报文出错,不会进行重传,因为重传会牵扯到检验和确认,因此实时性就不能保证

简短交互应用

  • 只需要一次交互过程
  • 交互过程中双方传输简短报文
  • 要求交互的实时性尽可能好

用UDP实现简短交互应用优点:

  1. 可以省略建立连接和释放连接过程所需要的开销
  2. 可以提高交互过程的实时性

TCP

特点和格式

UDP协议比较简单,而真正体现传输层功能的协议是TCP协议,它的功能也较与UDP更加复杂

由于功能的复杂,所以TCP数据的格式也更加复杂,因为需要用更复杂的数据结构来完成更多功能,比如我们为了标识不同的应用进程使用了端口号,而要做到差错控制(如果出错需要重传)和拥塞控制还需要哪些数据呢,接下来我们就来看看TCP的给应用层的数据加上的首部有哪些控制信息

标识进程

源端口号和目的端口号,分别标识发送端和接收端的进程

对字节流的拆分和组装

拆分时,将序号设置为该段在原始数据中的开始位置

差错控制

首先通过检验和对包括数据在内整个TCP报文进行差错检测,然后接收端通过一个确认序号表示正确接收到了序号之前的全部数据,并且通过将ACK设置为1说明确认序号是有效的,如果ACK位为0,则确认序号数据无效

流量控制

通过窗口信息,发送端可以知道接收端还能够接收到的最多字节数,同时还需要通过网络的情况来进行流量的控制,这个在后面会介绍

建立连接和释放连接

建立连接时,发送端请求连接,将SYN设置为1、ACK设置为0,接收端接收到以后,如果可以建立连接,回复的TCP中SYN设置为1、ACK设置为1,因此SYN为1的时候,说明是在连接的过程同步位SYN为1。当FIN为1,表示请求释放连接,接收端接收到以后就知道需要释放连接了。当网络中发生严重的错误,必须释放连接,这是就将RST设置为1,然后再建立连接。

其他控制

有的时候,有的数据需要紧急处理,我们就将URG设置为1,当接收端接收到一个报文并且URG为1的时候,那么传输层会马上将这个数据交个应用层,而紧急指针表面了需要紧急处理的数据字节数。推送位PSH为1的时候,也是告诉传输层,尽快的将这个数据交给应用层。可选项可以增加TCP的功能,由于有了可选项,TCP首部的长度是不固定的,因此TCP首部长度标识了首部的长度

建立和释放连接

TCP采用客户/服务器方式,主动发起连接建立的应用进程称为客户,等待建立连接的的应用进程称为服务器。建立连接的过程如下

客户端发动建立连接时,SYN为1,表示请求建立连接,ACK为0,说明确认序号无效,因此服务器端不用关心确认序号,而服务器接收到请求连接以后,回复确认建立连接,ACK为1,表示确认序号有效,因为它是确认客户端序号为x的报文,并且告知客户端服务器接收数据的窗口大小,然后客户端回复确认收到确认连接报文,确认序号为y+1,同时告知服务端发送端的窗口大小(因为客户端也要接收数据,同时是发送端和接收端,服务端也一样)

释放连接过程

释放连接的过程需要客户端和服务端分别申请释放,然后接收到请求释放的请求的一端回复一个确认请求报文

以上就是TCP中的连接三次握手和释放四次握手

发送窗口和接收窗口

发送窗口

发送窗口是指发送端(客户端和服务端都可以是发送端)的一段缓存,它有一个长度,表示发送端TCP协议可以发送的那部分,由于发送后需要接收端确认,因此在里面的内容可以是还没有发送的和发送了还没收到确认的数据,而在窗口之外的是还没有发送但是不能被TCP发送的和已发送并收到了确认的数据

接收窗口

接收窗口是指接收端(客户端和服务端都可以是接收端)的一段接收数据的缓存,当接收端接收到数据以后,由于可能还未收到需要组装的全部数据,因此传输层不会立马将这些数据传给应用层,会将这些数据放入这个缓存中,而每次回复确认时,接收端会将它的接受窗口大小告知发送端,因此发送端的发送窗口也需要做相应的调整,这样也达到了流量控制的效果

差错控制

在数据传输过程中,可能会发送错误,例如

  • 端到端存在多条传输路径,TCP报文经过网络传输后可能错序
  • 端到端传输路径经过的某条物理链路出现问题,使得数据传输过程中被丢弃
  • 接收端可能会重复接收TCP报文
  • TCP报文传输过程中可能会出错,接收端通过检验和检测出错误,被丢弃
  • 分组交换设备因为拥塞导致端口输出队列溢出可能会丢掉TCP报文,这是主要原因

这些错误归纳起来主要是两方面的错误

  1. 接收端接收到数据,检验出错误
    • 数据错了
    • 顺序错了
    • 重复接收
  2. 接收端没有接收到数据,数据在传输过程中被丢弃

接收端对于这两种错误都必须能够检验出来,并且做相应的处理,因此差错控制的核心就是检错、确认应答和重传,对于接收端和发送单必须做到:

  • 接收端接收到正确的数据,则发送确认应答,若接收错误的数据,则丢弃不确认
  • 发送端保留发送的数据报文,直到收到该数据的确认应答才能删除
  • TCP用确认序号给出接收端已经成功接收的字节流
  • 发送端在规定时间内接收不到确认应答,重发数据报文
  • TCP采用连续ARQ传输机制,不是等待确认再发送下一条,而是连续发送

首先,发送端需要对数据分段,分段后将该每段数据加上TCP首部,并且将序号设置为该数据在原始数据的开始位置,接收端可以根据序号对数据进行组装,而确认应答过程就需要对收到的序号进行回复,而确认回复的形式可能是逐个回复、累积回复,各种回复的情况如下:

对于发送端在什么情况下才会重传呢,主要有以下的情况:

  • 是TCP报文在传输过程中丢失
  • 因为TCP报文内容传输过程中出现错误,被接收端丢弃
  • 因为错序且TCP报文中字节的序号不属于接收窗口,被接收端丢弃

发送端可以通过两种方式确认重传

  1. 发送端设置重传定时器,重传定时器溢出,未收到确认应答
  2. 连续接收4个确认序号相同的确认应答

拥塞控制

在网络中,数据的传输可能会造成用拥塞,大量的拥塞就会引起报文的丢失,更严重就可能造成网络瘫痪

拥塞由于超过了链路的传输能力,因此是不是就可以加大链路的存储转发能力来改善网络的拥塞呢,这是可以做到的,但是并没有治本,这就和我们的高速公路一样,无论我们的高速公路有多宽多多,在一些节假日还是引起堵车,因此治本的方法是终端自己控制自己的发送流量,因此我们的终端必须要先确认是否发生拥塞了,网络传输TCP报文过程中发生丢失报文说明发生拥塞,报文丢失就需要重传,因此重传就需要调整发送端流量,如何进行流量的调整呢?不同拥塞程度会有相应程度的流量调整,控制流量依据是接收端的处理能力和网络状态,接收端的处理能力可以根据窗口来确定,就是我们上面的发送窗口根据接收窗口调整的办法,但是发送窗口的调整不止是接受窗口的大小来确定,还需要网络的情况来确定,这就是拥塞窗口,发送端会在接收窗口和拥塞窗口中选择一个最小值。最开始时,发送端对这两个窗口一无所知,于是进入慢启动过程:

如果在达到公告的窗口值都没有发送报文丢失的话,就用接收窗口来确定发送数据的大小,如果发送丢失,则采取相应的调整,丢失又分重传定时器溢出和连续接收到多个重复确认应答:

总结:

  • 在TCP连接刚建立时,发送端通过逐步增大拥塞窗口来探测网络能够承载的流量
  • 当发送端检测到有TCP报文丢失时,立即向下调整拥塞窗口
  • 检测TCP报文丢失的方法
    • 重传定时器溢出
    • 连续接收到多个重复确认应答
  • TCP报文丢失程度不同调整拥塞窗口的方法也不同

IP差错控制和TCP差错控制

在上面提到过IP的差错控制不是对整个数据的检验,这样做是为了提高传输的效率,而将数据的差错控制交给了传输层,这样做的原因还有:

  • 终端的处理能力越来越强,由终端完成数据的传输控制过程成为可能
  • 互联网的目的是实现终端间数据传输过程,只有终端间才能相互确认数据传输过程
  • 解决网络拥塞的根本手段是限制终端进入网络的流量,终端是控制数据传输过程的合适设备

因此IP和TCP必须有适合自己的差错控制,才能使网络的使用更高效,针对IP和TCP的不同情况,它们各自有自己适合的差错控制选择,而且它们相互之间的一些差错控制是不能互相替代的

  • 链路层帧携带的检错码不能检测出所有的错误,需要多种检错机制协同工作
  • 传输网络差错控制机制无法处理路由器因为拥塞丢弃IP分组
  • 每一个IP分组独立选择传输路径,使得IP分组端到端传输时延变化很大,个别IP分组因为传输时延太大被接收端拒绝接收
  • 接收端的缓冲器大小决定了接收端的接收窗口大小,IP分组不能按序到达的特性使得部分IP分组因为不在接收窗口范围内被接收端拒绝接收
  • 互联网的目的是实现终端间数据传输过程,只有终端间才能相互确认数据传输过程

  • 如果传输网络的可靠性很好,两个结点之间链路层帧传输出错的概率很小,可以取消该传输网络的重传机制,如以太网。
  • 如果传输网络的可靠性较差,两个结点之间链路层帧传输出错的概率不是很小,需要由传输网络本身的差错控制机制及时完成该传输网络对应的链路层帧的出错重传过程,如无线局域网
坚持原创分享,您的支持将鼓励我不断前行!