UDP与TCP

用户数据报协议UDP

特点

  • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
  • 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;
  • 面向数据报: 不能够灵活的控制读写数据的次数和数量;
  • 没有拥塞控制,出现网络拥堵是不会影响源主机的发送速率;
  • UDP支持一对一,一对多,多对一,多对多地交互通信;
  • UDP首部开销小;

UDP首部格式

在这里插入图片描述

  • 源端口:源端口号,在需要对方回信时使用。不需要时可全用0。
  • 目的端口:目的端口号,这在终点交付报文时必须使用。
  • 长度:UDP用户数据报的长度,最小值为8(仅存在首部)
  • 检验和:检测UDP用户数据报在传输时是否有错。

传输控制协议TCP

特点

  • 面向连接的运输层协议,应用程序在使用TCP之前必须要先建立TCP连接,使用完毕之后必须释放连接。
  • 每一条TCP链接只能有两个端点。
  • TCP提供可靠交付
  • TCP提供全双工通信
  • 面向字节流:TCP不知道上层交给他的数据块,仅把它看做一串无结构地字节流,TCP并不知到所传字节流的含义。如应用层交给TCP10个数据块,但TCP只用了4个数据块就将其全部发送出去了。

TCP首部格式

在这里插入图片描述

  • 源端口号与目的端口号:与UDP一致
  • 序号:占4字节范围[0,2³² - 1],共2³²个序号,序号增加到最大值后,下一个序号就又回到0。TCP是面向字节流的,传输时为每一个字节都按顺序编号,传送的起始序号在建立连接时有计算机随机产生。首部中的序号为本报文第一个字节的序号,如一个报文的序号为301,而携带的数据为100字节,则表明有效数据第一个字节的序号为301,最后一个字节的序号为400。当前报文准确送达之后下一次的报文序号由401开始
  • 确认号:占4字节,与序号一致,表示该序号之前的字节都已经收到,并期望收到对方下一个报文段的第一个字节的序号
  • 数据偏移(长度):占4位,表明TCP首部的长度,单位是4字节,即TCP首部的长度范围:[20,60]。20为固定长度,其余为可变长度选项。
  • 保留:占6位,保留为今后使用,设置为0即可。
  • 紧急URG:当URG为1时,表明紧急指针字段有效。
  • 确认ACK:当ACK为1时,确认号字段有效,TCP规定,当连接建立之后所有传送的报文段都必须把ACK置1。
  • 推送PSH:接收方收到PSH为1的TCP报文时会将缓冲区的数据直接交付给应用进程而不是等到缓冲区满了以后再交付。
  • 复位RST:RST为1时,表明TCP连接出现差错,必须释放连接,然后重新建立连接。也可以用来拒绝一个非法的报文或拒绝打开一个连接。
  • 同步SYN:SYN为1时,表明这是一个请求建立连接的报文。
  • 终止FIN:FIN为1时,表明这是一个请求释放连接的报文。
  • 窗口:占2位,表示发送报文段一方的接收窗口。即还可以接受多少数据,供另外一方设置自己的发送窗口大小。
  • 检验和:检验报文是否出现差错。
  • 紧急指针:指出本报文段中紧急数据的字节数。(紧急数据会被放在有效数据的最开始的位置,也可以认为紧急指针指出了紧急数据在有效数据中的结束位置)。
  • 选项:长度可变,有诸多选项,可对TCP传输进行相关设置。

TCP可靠传输的实现

TCP之所以可以实现可靠传输,主要就是加上了序列号与确认号,每一个字节都被编号,发送方将数据发送出去,接受方收到数据之后可以根据序号排序(由于网络原因,发送方按序发出的数据不一定在接收方按序到达),然后对于已经有序的数据就向发送方返回确认报文(ACK == 1),通过确认号表明该序号之前的数据已经收到,此时发送方就可以继续发送从序号开始的以后的数据

超时重传

自动重传请求ARQ
发送方在发送出报文后会设置一个倒计时,如果倒计时为0时还没有收到接受方的确认报文,则发送方认为此报文未成功发送,重新发送该报文。
发送方没有收到确认报文的两种情况:

  1. 报文丢失:此时报文确实没有成功发送,重传即可
  2. 确认迟到:即接受方成功收到了报文,向发送方发送确认报文,但是由于网络拥堵,已经超出了发送方设置的倒计时,但发送方还没有收到确认报文,此时重传报文,接受方会收到重复的报文,此时接收方会直接丢弃该报文,然后向发送方重新发送确认报文。

连续ARQ与滑动窗口
如果每发送一次数据就要等待一次确认,会使效率大大降低,因此TCP采用一个非常巧妙地方法:滑动窗口。
在这里插入图片描述
A为发送方,B为接收方。后沿之后的数据表明B已经收到,后沿与前沿中的数据表示可以发送的数据或已经发送的但没有收到确认的数据,前沿以前表示还不可以发送的数据。

发送方发送报文时不是发送一个报文而是发送一批报文,在滑动窗口内的报文都可以发送出去。B接收到报文后,对每个报文做出应答,假设A先收到了确认号为40的确认,则表示序号40之前的报文B都已经接受到,即使没有收到40之前的确认报文滑动窗口也可以向前滑动,后沿改为40。前沿相应的向前移动。所以使用滑动窗口的情况下可以允许一些确认报文的丢失。

滑动窗口的大小是不固定的,随时变化的,取决于接接收方的窗口大小与当前网络拥堵状况。

TCP流量控制

TCP使用滑动窗口来提高传输效率,传输时不一定可以一直传输,接收方的应用程序处理数据较慢,是的接收缓冲区已满,无法存储新的报文,因此接受方可近似的认为无法收到新的报文,需要将这一信息发送给发送方,否则发送方发送新的数据,但是由于接受方无法收到新数据,进而不会确认收到。发送方会一直进行超时重传,占用网络资源。

所以在TCP首部中增加了窗口字段,表示接受缓冲区剩余的大小,一边发送方在发送时不会发送超过该大小的数据导致接受方无法接受。当窗口大小为0时,发送方停止发送数据,每隔一段时间发送探测报文(仅携带1字节数据),询问接收方的窗口大小,当大小不为0时恢复通信。

TCP规定:即使窗口为0时,接受方也可以接受以下几种报文段
探测报文、确认报文和携带紧数据的报文。

提高网络利用率

Nagle算法

TCP为了提高网络利用率,经常使用Nagle算法,该算法限制了每次发送时有效数据的长度,假如一个报文的有效数据只有1字节,但是仅TCP报头就有20甚至更多的字节,这使得一个报文中有效数据的比率过于低下,所以Nagle算法只有满足下面其中一个条件或者等待一段时间还没有新的数据时才可以发送数据。

  • 已发送的数据都已经收到确认应答
  • 可以发送的数据已经有效数据最大长度(MSS)时

延时应答

当接受方收到报文后,如果直接对发送方进行应答,可能会返回一个较小的窗口值(缓冲区刚收到数据,上层应用还没处理),而事实上接受方应用处理数据的速度非常快,可能在刚刚发送确认应答之后就将缓中区的数据处理完毕,接受方收到小的窗口值后减缓发送速率,导致效率低下。

因此接受方在收到报文时不会立即进行确认应答,而是等一段时间在应答。由于滑动窗口的存在,此种方式也不会影响发送方的发送效率,因此确认应答少一些也不碍事。

捎带应答

TCP通信时全双工的,接受方也可能向发送方发送数据,因此可以将接受方向发送方要发送的数据放到对发送方的确认应答中来提高效率。捎带应答需要配合延时应答来使用,接受方收到数据不会立即发送,可以等上层应用程序处理完毕数据,然后将结果与应答一同发送过去。

TCP拥塞控制

TCP要考虑两个主机之间的通信效率,就不得不考虑网络因素。当前网络如果较为拥堵的的话就不适宜在发送数据了。所以使用TCP通信时发送方会维护一个拥塞窗口,表示当前网络中的拥塞程度,发送方的滑动窗口也不得超过拥塞窗口。当发生超时重传时表明当前网络已经拥堵,执行相关操作。

慢开始
两个主机最开始发送数据时,拥塞窗口为1(实际中该数值为字节数,方便起见这里指的是可发送报文段的个数)发送方将滑动窗口中的所有数据都发送出去,然后收到接受方的确认应答,这正好经过了一个轮次(一个RTT),则拥塞窗口大小为原来的2倍,拥塞窗口开始时慢,但不会一直慢下去。

拥塞避免
使用慢开始算法拥塞窗口会呈现指数增长,所以在拥塞窗口增大到一定量之后就不可以再像之前那样增长了,这个一定量被称为"阈值",当拥塞窗口增长到阈值时,执行拥塞避免算法,每经过一个RTT,拥塞窗口不在是之前的2倍,而是在之前的基础上加一。拥塞避免不是真的可以绝对避免拥塞,只是使网络不容易出现拥塞

每一次进行超时重传后发送方都会执行慢开始,然后将阈值改为发生拥塞时拥塞窗口的一半大小。

快重传
如果一个报文在网络传输时出现故障,丢失了,此时尽管网络没有出现拥堵情况,但是如果发送方出现了超时重传,就会认为出现网络拥堵,从而重新设置拥塞窗口,执行慢开始,导致传输效率降低。

所以接受方如果发现某个报文未到达,但之后的报文已经到达,接受方此时不可以在进行延时应答而是立即向发送方发送确认之前已经收到的报文。如发送方发送了M1~M5,5个报文,M2丢失,接受方收到M3后直接向发送方发送M1的确认,每收到一个新的且不是M2的报文就向发送方发送M1的确认报文,发送方连续收到3个对M1的确认报文后立即重新发送M2报文,而不会等到M2报文的超时重传时间到了之后在重传,也就不会出现慢开始导致效率降低。

快恢复

发生快重传时,发送方不执行慢开始算法,而是执行快恢复算法,将拥塞窗口与阈值都改为发生快重传时拥塞窗口的大小的一半,并开始执行拥塞避免算法

TCP连接管理

建立连接

TCP建立连接的过程,发送三次报文,也称三次握手
在这里插入图片描述起始时,客户端与服务器端都处于关闭状态。

客户端想要建立连接,客户端首先向服务器发送报文,SYN为1,表示这是一个请求建立连接的报文,初始序号seq由客户端随机生成。发送为完毕客户端进入SYN-SENT状态

服务器端收到建立连接的请求,发送响应报文,SYN为1,表示这也是一个请求建立连接的报文(TCP是全双工通信),ACK为1,表示确认号有效,sep序号由服务器随机生成,ack表示序号为x的数据已经收到,下一次从x+1开始发送。发送完毕服务器端进入SYN-RCVD状态

客户端收到服务器的应答,然后对服务器端的请求连接进行应答,ACK为1,确认号有效,sep为x+1,ack为y,表是收到y序号以及y之前的报文。发送完毕客户端进入ESTAB-LISHED状态,客户端认为连接建立完成。

服务器收到客户端的应答,进入ESTAB-LISHED状态,服务器认为连接建立完成。

至此连接建立结束,双方可以正常通信。

释放连接

TCP释放连接的过程,一般发送四次报文,也称为四次挥手
在这里插入图片描述
客户端想要释放连接,首先向服务器端发送报文,FIN置为1,表示这是一个请求释放连接的报文,序号sep承接收到的应答报文。发送完毕后客户端进入FIN-WAIT-1状态

服务器端收到请求释放连接的报文后,对该报文做出应答,然后服务器端进入CLOSE-WAIT状态。此时服务器可能还要向客户端发送数据,所以该状态可能会持续一段时间。客户端收到该应答后,客户端不会再向服务器发送带有有效数据的报文了,客户端进入FIN-WAIT-2状态。

服务器向客户端发送的数据发送完毕,没有有效数据要发送了,则服务器端向客户端发送请求释放连接的报文,发送完毕后服务器进入LAST-ACK状态

客户端收到服务器发送得释放连接的报文,对该报文进行应答,发送完毕之后客户端进入TIME-WAIT状态。TIME-WAIT状态持续2MSL,为了保证对服务器的应答服务器可以收到,如果在改时间内服务器没有收到应答,就会重新向客户端发送请求释放连接的报文,客户端就会重新应答,如果超过2MSL还没有收到服务器端重新发送的请求释放连接的报文,则证明服务器端收到应答,然后正常关闭进入CLOSE状态。

服务器端收到客户端发送的应答报文,关闭连接,进入CLOSE状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值