传输层TCP与UDP

运输层

网络层为主机间提供通讯,运输层为应用程序提供通信。网络层IP数据报仅仅能实现两个主机点对点间的通讯,而传输层实现的是两个主机进程间的通讯(应用程序互相通讯)。缓存

 

TCP协议

概述 
TCP协议和UDP协议处于同一层:传输层,可是二者之间有很大的区别,TCP协议具备如下特色:服务器

这里写图片描述

  • TCP提供可靠的数据传输服务,TCP是面向链接的,即数据在通讯之间要先创建链接,结束通讯时要释放链接,这也是后面所说的3次握手,4次挥手;
  • TCP是点对点的链接方式,即一条TCP链接两端只能是两个端点;
  • TCP提供可靠的,无差错的,不丢失,不重复,按顺序的服务;
  • TCP提供全双工通讯,容许通讯双方任什么时候候都能发送数据,TCP在链接的两端都设置有发送缓存和接收缓存;
  • TCP是面向字节流的,TCP传输的数据是一个一个字节的按序传输的,数据块与数据块之间没有边界信息,对于TCP来讲,全部数据都是同样的,TCP不能区分数据的意义。

 

TCP报文结构: 


TCP 报文段的报头有前 20 字节的固定部分,后面 4n 字节是根据须要而添加的字段,下图是TCP完整的报文结构:网络

这里写图片描述

20 字节的固定部分,各字段功能说明:并发

  • 源端口和目的端口: 各占 2 个字节,分别写入源端口号和目的端口号。这和 UDP 报头有相似之处,由于都是运输层协议。
  • 序号: 占 4 字节序,序号范围[0,2^32-1],序号增长到 2^32-1 后,下个序号又回到 0。 TCP 是面向字节流的,经过 TCP 传送的字节流中的每一个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号。
  • 确认序号: 占 4 字节,指望收到对方下个报文段的第一个数据字节的序号。
  • 数据偏移: 占 4 位,指 TCP 报文段的报头长度,包括固定的 20 字节和选项字段。
  • 保留: 占 6 位,保留为从此使用,目前为 0。
  • 控制位: 共有 6 个控制位,说明本报文的性质,意义以下: 
    URG 紧急:当 URG=1 时,它告诉系统此报文中有紧急数据,应优先传送(好比紧急关闭),这要与紧急指针字段配合使用。 
    ACK 确认:仅当 ACK=1 时确认号字段才有效。创建 TCP 链接后,全部报文段都必须把 ACK 字段置为 1。 
    PSH 推送:若 TCP 链接的一端但愿另外一端当即响应,PSH 字段即可以“催促”对方,再也不等到缓存区填满才发送。 
    RET 复位:若 TCP 链接出现严重差错,RST 置为 1,断开 TCP 链接,再从新创建链接。 
    SYN 同步:用于创建和释放链接,稍后会详细介绍。 
    FIN 终止:用于释放链接,当 FIN=1,代表发送方已经发送完毕,要求释放 TCP 链接。
  • 窗口: 占 2 个字节。窗口值是指发送者本身的接收窗口大小,由于接收缓存的空间有限。
  • 检验和: 2 个字节。和 UDP 报文同样,有一个检验和,用于检查报文是否在传输过程当中出差错。
  • 紧急指针: 2 字节。当 URG=1 时才有效,指出本报文段紧急数据的字节数。
  • 选项: 长度可变,最长可达 40 字节。具体的选项字段,须要时再作介绍。

TCP链接和释放: 


3.1. 三次握手 
这里写图片描述

TCP三次握手过程:socket

 

  • 客户端发出请求链接报文段,其中报头控制位 SYN=1初始序号 seq=x。客户端进入 SYN-SENT(同步已发送)状态。
  • 服务端收到请求报文段后,向客户端发送确认报文段。确认报文段的首部中 SYN=1ACK=1确认号是 ack=x+1,同时为本身选择一个初始序号 seq=y。服务端进入 SYN-RCVD(同步收到)状态。
  • 客户端收到服务端的确认报文段后,还要给服务端发送一个确认报文段。这个报文段中 ACK=1确认号 ack=y+1,而本身的序号 seq=x+1。这个报文段已经能够携带数据,若是不携带数据则不消耗序号,则下一个报文段序号仍为 seq=x+1。
  • 至此 TCP 链接已经创建,客户端进入 ESTABLISHED(已创建链接)状态,当服务端收到确认后,也进入 ESTABLISHED 状态,它们之间即可以正式传输数据了。

3.2. 四次挥手 

这里写图片描述

TCP四次挥手过程:spa

注意此时链接尚未释放,须要时间等待状态结束后(4 分钟) 链接两端才会 CLOSED。设置时间等待是由于,有可能最后一个确认报文丢失而须要重传,下面具体阐述TIME-WAIT(时间等待)状态的缘由:设计

TIME_WAIT状态维持的时间是最长分节生命期的2倍,2MSL(MSL=30s~120s)指针

3.3. TIME-WAIT状态的带来的影响和解决方法 
因为TIME-WAIT状态的存在,使得socket能够进入和留存至关长一段时间,若是你的系统中有不少 socket 处于TIME-WAIT状态,那么当你须要建立新的 socket 链接的时候可能会受到影响,这也会影响到你的程序的扩展性。由于在一个TCP链接中,一个Socket若是关闭的话,它将保持TIME-WAIT状态大约 4分钟 。若是不少链接快速的打开和关闭的话,系统中处于TIME-WAIT状态的socket将会积累不少,你可使用netstat命令查看处于TIME-WAIT状态的socket。因为本地端口数量的限制,同一时间只有有限数量的socket链接能够创建,若是太多的socket处于TIME_WAIT状态,你会发现,因为用于新建链接的本地端口太缺少,将会很难再创建新的对外链接。在Linux中,能够经过设置SO_REUSEADDR容许链接重用,TIME-WAIT的存在是有它的理由的,经过缩短2MSL的时间或者使用SO-REUSEADDR容许链接重用并不老是好主意。若是你有能力去设计你的协议避免TIME-WAIT产生的问题的话,你就能够避免这里全部的问题。视频

  • 此时 TCP 链接两端都还处于 ESTABLISHED 状态,客户端中止发送数据,并发出一个 FIN 报文段。首部 FIN=1序号 seq=u(u 等于客户端传输数据最后一字节的序号加 1)。客户端进入 FIN-WAIT-1(终止等待 1)状态。
  • 服务端回复确认报文段,确认号 ack=u+1序号 seq=v(v 等于服务端传输数据最后一字节的序号加 1),服务端进入 CLOSE-WAIT(关闭等待)状态。如今 TCP 链接处于半开半闭状态,服务端若是继续发送数据,客户端依然接收。
  • 客户端收到确认报文,进入 FIN-WAIT-2 状态,服务端处理完数据后,发出 FIN 报文段,FIN=1,确认号 ack=u+1,而后进入 LAST-ACK(最后确认)状态。
  • 客户端回复确认确认报文段,ACK=1,确认号 ack=w+1(w 为半开半闭状态时,收到的最后一个字节数据的编号) ,序号 seq=u+1,而后进入 TIME-WAIT(时间等待)状态。
  • 缘由一:可靠的实现TCP全双工链接的终止 
    若是客户端在接收到服务器端的FIN后,发送的ACK分组在通路中丢失,因为超时重传机制,服务器端没有接受到来自客户端的应答,所以从新发送FIN,这时总共经历的时间最大可能为2MSL,当第二个FIN到达时,保证在客户端维护必要的状态信息确保可以发送最终的ACK,保证两边都可以关闭
  • 缘由二:容许老的重复分节在网络中消逝 
    若是关闭一个连接后,立刻创建新的连接,这个连接的IP地址和端口号和刚关闭的连接相同,这时候若是上一个连接中重复的分节没有消逝,这时这个重复的分节就有可能被新的连接接收,因此为了防止旧连接中的分节可以消逝,不影响新连接,将TIME_WAIT设置为2倍的MSL。
  1. TCP可靠传输的实现:排序

    超时重传机制很费时间,每发送一个数据报都要等待确认。在实际应用中的确不是这样的,真实状况是,采用了流水线传输:发送方能够连续发送多个报文段(连续发送的数据长度叫作窗口),而没必要每发完一段就停下来等待确认。实际应用中,接收方也没必要对收到的每一个报文都作回复,而是采用累积确认方式:接收者收到多个连续的报文段后,只回复确认最后一个报文段,表示在这以前的数据都已收到。这样,传输效率获得了很大的提高。

    • (1) TCP 报文段的长度可变,根据收发双方的缓存状态、网络状态而调整。
    • (2) 当 TCP 收到发自 TCP 链接另外一端的数据,它将发送一个确认。
    • (3) 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,若是不能及时收到一个确认,将重发这个报文段。这就是稍后介绍的超时重传。
    • (4) TCP 将保持它首部和数据的检验和。若是经过检验和发现报文段有差错,这个报文段将被丢弃,等待超时重传。
    • (5) TCP 将数据按字节排序,报文段中有序号,以确保顺序的正确性。
    • (6) TCP 还能提供流量控制。TCP 链接的每一方都有收发缓存。TCP 的接收端只容许另外一端发送接收端缓冲区所能接纳的数据。这将防止较快主机导致较慢主机的缓冲区溢出。

UDP协议

用户数据报协议,它只在 IP 数据报服务之上增长了不多一点功能,它的主要特色有: 
(1) UDP 是无链接的,发送数据以前不须要创建链接(而 TCP 须要),减小了开销和时延。 
(2) UDP尽最大努力交付,不保证交付可靠性。 
(3) UDP 是面向报文的,对于从网络层交付下来的 IP 数据报,只作很简单的封装(8 字节 UDP 报头),首部开销小。 
(4) UDP 没有拥塞控制,出现网络拥塞时发送方也不会下降发送速率。这种特性对某些实时应用是很重要的,好比 IP 电话,视频会议等,它们容许拥塞时丢失一些数据,由于若是不抛弃这些数据,很可能形成时延的累积。 
(5) UDP 支持一对1、一对多、多对一和多对多的交互通讯。

UDP报文: 
UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:

这里写图片描述

(1)源端口 2 字节 在对方须要回信时可用,不须要时能够全 0; 
(2)目的端口 2 字节 必须,也是最重要的字段; 
(3)长度 2 字节 长度值包括报头和数据部分; 
(4)校验和 2 字节 用于检验 UDP 数据报在传输过程当中是否有出错,有错就丢弃。

面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。所以,应用程序必须选择合适大小的报文。若报文太长,则IP层须要分片,下降效率。若过短,会是IP过小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。

面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序当作是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就能够把它划分短一些再传送。若是应用程序一次只发送一个字节,TCP也能够等待积累有足够多的字节后再构成报文段发送出去。

这里写图片描述

TCP和UDP的对比: 
这里写图片描述

这里写图片描述

相关文章
相关标签/搜索