四、传输层

传输层主要提供端到端的通信服务,分为TCP和UDP两种协议。TCP是面向连接、可靠的传输机制,拥有确认应答、序列号、超时重传等机制保证数据的正确传输,适用于HTTP、HTTPS等需要高可靠性的场景。UDP则是无连接、不可靠的,适合于DNS、实时游戏等对速度要求高、能容忍丢包的场景。TCP的连接建立通过三次握手,关闭则需要四次挥手。

传输层

传输层主要是为运行在不同主机上的应用进程提供直接的通信服务(端到端的通信)。

通信单元为:报文段

端口为应用层的各个应用进程的数据通过这个“门”向下传递给传输层。

  1. 服务端使用的端口号:(1)熟知端口号:0~1023。分配给TCP/IP最重要的一些应用进程。
    (2)登记端口号:1024~49151。给没有熟知端口号的应用程序使用
应用进程FTPTELNETSMTPDNSTFTPHTTPSNMP
端口号212325536980161

2.客户端使用的端口号:49152~65535。也叫短暂端口号。是在客户端进程运行成功后动态选择的。

端口号具有本地意义,即端口号只是标志本机计算机应用层的各个进程。在互联网中,不同主机的相同端口号没有联系。

套接字(socket):在网络中通过IP来唯一标识一个主机。通过端口号来标识一台主机中的不同进程。所以网络连接出现socket套接字来标识一个主机上的某进程。

套接字(socket)=(Host IP,port)


UDP协议

在这里插入图片描述16位UDP长度:UDP首部+UDP数据


特点1:无连接服务

无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接。

全双工:UDP的socket既能读,也能写

无连接服务和面向连接服务

面向连接和无连接的区别在于通信双方通信之间,是否需要先建立连接。

面向连接:在通信过程中,整个连接的过程一直被监控和管理,通信结束之后,释放这个连接。

无连接服务:两个实体之间需要需要通信时,直接将信息发到“网络”上,让该信息在网上尽力传输到目的方。

UDP协议是无连接的不可靠传输机制,它在IP之上仅仅提供了多路复用、数据差错检查服务

由于UDP服务不需要建立连接,执行速度快,实时性号,只用于小文件的传输协议。(DNS、SNMP、RTP、TFTP)


特点2:不可靠

没有确认机制,没有重传机制;如果因为网络故障该段无法发送到对方,UDP协议也不会给应用层发挥任何错误信息。


特点3:面向数据报

不能够灵活的控制读写数据的次数和数量。

应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并,交付时一次交付一整个报文。


特点4、5:无拥塞控制、支持多种通信

网络的拥塞不会使得源主机的发送速率降低,允许丢失一些数据。

支持一对一、一对多、多对一和多对多的交互通信。


UDP协议的一些问题

1、UDP和TCP的简单介绍
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。
TCP是面向流字符,应用程序产生的全体数据与真正发送的单个IP数据报可能没什么联系。

2、为什么要加有伪首部?
目的是让UDP两次检查数据是否到达正确的目的地。
IP接收正确的目的地址,传送到正确的上层程序。
所有伪首部包括:源IP地址、目的IP地址、0、协议号、UDP长度


TCP协议

在这里插入图片描述

  • 源端口号
  • 目的端口号
  • 序列号(seq)
  • 确认号(ack):期望收到的数据的开始序列号。也即已经收到的数据的字节长度+1。
    • 如果含有同步化标识(SYN),则此为最初的序列号;第一个数据比特的序列号为本序列号+1
    • 如果没有SYN,则此为第一个数据比特的序列码。
  • 首部长度:以4个字节为单位计算出的数据段开始地址的偏移值。
  • 保留:置为0
  • 标识符
    • URG:为1表示高优先级数据包,紧急指针字段有效。
    • ACK:为1表示是确认字段有效。
    • PSH:为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满(很少用)
    • RST:为1表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
    • SYN:为1表示这是连接请求或者是连接接受请求,用于创建连接和使顺序号同步
    • FIN:为1表示发送方没有数据要传输了,要求释放连接。
  • 窗口(WIN):表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。用于流量控制。
  • 校验和:对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
  • 紧急指针:本报文段中的紧急数据的最后一个字节的序号。
  • 选项字段用于方发送方与接收方协商最大报文段长度(MSS),活在告诉网络环境下用作窗口调节因子时使用。

TCP协议可靠传输机制

可靠:不错、不丢、不乱

1、检验和

与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分。

2、序列号
  1. 保证可靠性(缺少某个序号的数据能马上知道)
  2. 保证数据按序到达
  3. 提高效率,可实现多次发送,一次确认
  4. 去除重复数据
3、确认应答机制

TCP首部有一个标志位——ACK,此标志表示确认号是否有效。进行确认是,确认字段值表示这个值之前的数据已经按序到达了。
在这里插入图片描述

4、超时重传机制

当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个闹钟,到点了还没有收到应答则进行重传),其基本过程如下:
在这里插入图片描述当然,未收到确认不一定就是发送的数据包丢了,还可能是确认的ACK丢了:
在这里插入图片描述
当接收方接收到重复的数据就将其丢掉,重新发送ACK。想要识别出是重复的数据,就要使用序列号,可以很容易完成去重的功能。

重传时间的确认:数据在分组传输的平均往返时间RTT,超时重传时间应当略大于这个RTT。TCP会根据网络情况动态计算RTT,即RTO是不断变化的。在Linux中,超时以500ms为单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。

例如:如果重发一次得不到应答,就等待2×500ms在进行重传,如果仍然得不到就等待4×500ms后重传,以指数形式递增,若重传次数累计一定次数后,TCP认为网络或对端主机有异常,就会强行关闭连接。

5、三次握手和四次挥手的连接控制机制
三次握手

在这里插入图片描述服务端首先建立传输控制块TCB,进入LISTEN(收听)状态,等待用户的连接请求。如有,则建立连接。(这个过程在套接字编程中为服务器端调用socket函数、bind函数和listen函数的过程)

  • 第一步客户端建立传输控制块TCB,然后向服务端的TCP发送一个特殊的TCP报文段。该报文段不包含应用层数据,但是消耗一个序列号。报文段的首部一个标志位(SYN)被置为1。因此,该报文段称为SYN报文段。客户机会选择一个起始序号(x),将其放置在SYN报文段的**序号字段(seq)**中。该报文段封装在IP数据报中,发送给服务器。然后进入SYN-SENT(同步已发送)状态。(这个过程在套接字编程中为客户端调用socket函数和connect函数的过程)
  • 第二步一旦包含TCP SYN报文段的IP数据报到达服务器主机,服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向客户机发送允许连接的报文段。这个允许连接的报文段也不包含应用层数据,也要消耗一个序列号。但是其首部包含3个重要信息:SYN=1,ACK=1;该TCP报文段首部的确认号字段(ack)置为x+1;最后服务器选择自己的初始序号(y),放置在TCP报文段首部的序号字段(ack)。然后进入SYN-RCVD(同步收到)状态。
    • 这个允许连接的报文段实际上表明了:“我收到你要求建立连接的、带有初始序号x的SYN分组。我同意建立该连接。我自己的初始序号时y”
    • 该允许连接的报文段有时被称为SYNACK报文段
  • 第三步在收到SYNACK报文段后,客户机也要为该连接分配缓存和变量。客户机主机还会向服务器发送另外一个报文段,这个报文段对服务器的允许连接的报文段进行了确认。(客户机通过将值y+1放置在TCP报文段首部的确认字段中完成此项工作。)因为连接已经建立了,所以此时SYN=0,ACK=1,客户端进入ESTABLISHED状态(已建立连接状态)。
    服务端收到客户端确认后,也进入ESTABLISHED状态。
四次挥手

在这里插入图片描述

  • 第一步当客户端的数据传送完之后,就可以向其TCP发起连接释放了,此后就要停止再发送数据,主动关闭TCP连接。首先客户端向服务端发送FIN报文段,报文段首部FIN=1,序列号seq=u(u为最后传送的数据的序号+1),然后A进入FIN-WAIT-1(停止等待1)状态。FIN报文段不能携带数据,但要消耗一个序列号。
  • 第二步服务端收到释放连接的报文段后发出确认报文段,报文首部ACK=1,ack=u+1,seq=v(v等于前面服务端传送过的数据的序列号加1),然后B进入CLOSE-WAIT(关闭等待)状态。此时从客户端到服务端的连接就是放了,TCP处于半关闭状态。(注意:此后客户端不能主动向服务端发送数据,但是客户端可以给服务端发送确认报文段,也就是说客户端仍要接收来自服务端的报文段,因为此时服务端到客户端的连接这个方向还没关闭)
    • 当客户端收到服务端的确认报文后,就进入FIN-WAIT-2(终止状态),等待服务端发出的连接释放报文段。
  • 第三步当服务端的数据发送完毕之后,其应用进程就通知TCP释放连接。服务端向服务端发送FIN报文,报文首部FIN=1,ack=u+1(重复发送上一次已经发送过的确认号),seq=w(w为服务端最后发送报文段序号+1),然后服务端进入LAST-ACK(最后确认状态),等待客户端确认。
  • 第四步客户端接收到服务端连接释放报文,必须进行确认。客户端向服务端发送的确认报文首部中ACK=1,ack=w+1,seq=u+1。然后A进入TIME-WAIT(时间等待)状态(如无差错,此状态时间为2MSL)。注意:此时TCP连接还没被释放掉,必须经过TIME-WAIT设置的时间2MSL后,客户端才撤销相应的传输控制块TCB,才进入CLOSED状态,结束这次TCP连接。
    • MSL叫做最长报文段寿命,RFC793建立设为2min,在实际网络情况中,常用值有三种:30s,1min,2min。必须要在客户端进入CLOSED状态才能开始建立下一个新的连接。
    • 服务端收到客户端的确认报文之后,也进入CLOSED状态,撤销相应的传输控制块TCB,此时TCP连接全部断开。
同时打开

同时打开连接是指通信的双方在接收到对方的SYN包之前,都进行了主动打开的操作并发出了自己的SYN包。如之前所说一个四元组标识一个TCP连接,因此如果一个TCP连接要同时打开需要通信的双方知晓对方的IP和端口信息才行,这种场景在实际情况中很少发生(NAT穿透中可能会多一些)。
在这里插入图片描述具体流程我们不在逐条消息进行介绍。注意上图中,TCP连接同时打开的时候与三次握手的主要区别如下

  • 我们同时称呼A和B为Client,他们都执行主动打开的操作(Active Opener)。

  • 同时两端的状态变化都是由CLOSED->SYN_SENT->SYN_RCVD->ESTABLISHED

  • 建立连接的时候需要四个数据包的交换,并且每个数据包中都携带有SYN标识,直到收到SYN的ACK为止

同时关闭

同时关闭相对于我们讲过的四次握手过程基本类似,注意两者状态转换的区别,同时关闭是由ESTABLISHED->FIN_WAIT_1->CLOSING->TIME_WAIT->CLOSED
在这里插入图片描述

半关闭

终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送。发送FIN通常是应用层对socket进行关闭的结果。


6、流量控制机制

接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满了,而发送端继续发送,就会造成丢包,进而引起丢包重传一系列连锁反应。

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制称为流量控制。

在TCP报文段首部中有一个16位的窗口,当接收端接收到发送方的数据后,在应答报文ACK中就将自身缓冲区的剩余大小,放入16位窗口大小总。如果自身缓冲区快满了,窗口设置更小的值通知对方;如果已满,设置为0,发送方就不再发送数据,但是需要顶起发送一个窗口探测数据段,让接收端把窗口大小告诉发送端。

注意:窗口大小不受16位窗口大小限制,在TCP首部40字节选项中还包含一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位。
在这里插入图片描述

滑动窗口

接收端一般采用累计确认的方式。可以在收到几个分组后,对按序到达的最后一个分组发送确认,表示到这个分组位置的所有分组都已正确收到了。
在这里插入图片描述

  • 窗口合拢:当窗口从左边向右边靠近的时候,这种现象发生在数据被发送和确认的时候。
  • 窗口张开:当窗口的右边沿向右边移动的时候,这种现象发生在接受端处理了数据以后。
  • 窗口收缩:当窗口的右边沿向左边移动的时候,这种现象不常发生。
拥塞控制

1、慢启动算法
在刚开始启动TCP连接时,先令拥塞窗口cwnd=1,即最大的报文段长度MSS,每收到一个对新的报文段的确认后,将cwnd加1.用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入网络的效率更高。成指数型增长,直到达到一个阈值后再改用拥塞控制算法。

思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为单位的。

为了防止cwnd增长过大引起网络拥塞,设置一个慢开始门限(ssthresh状态变量) 当cnwd<ssthresh,使用慢开始算法 当cnwd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法 当cnwd>ssthresh,使用拥塞避免算法

2、拥塞避免
拥塞控制的做法是:发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小。而不是加倍。使cwnd呈现线性增长(即加法增大),而当出现一次超时(网络拥塞),则让慢启动的门限阈值减少为当前cwnd的一半(乘法减小)。

慢开始算法是指开始发送数据时,并不清楚网络的负荷情况,会先发送一个1字节的试探报文,当收到确认后,就发送2个字节的报文,继而4个,8个以此指数类推。

需要注意的是,慢开始的“慢”并不是指拥塞窗口的增长速率慢,而是指在TCP开始发送报文时先设置拥塞窗口=1。

拥塞避免算法是让拥塞窗口缓慢地增大,即cwnd加1,而不是如慢开始算法一样加倍。

在这里插入图片描述根据上图的实例进行分析,一开始的慢开始算法的指数增长是很恐怖的,所以为了防止拥塞窗口cwnd增长过快需要设置一个门限ssthresh,这里是16。

  1. 当 cwnd < ssthresh 时,使用上述的慢开始算法。
  2. 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
  3. 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。(通常做法)

无论在慢开始阶段还是在拥塞避免阶段,只要发送方没有收到确认,就认为这时候拥塞了,就要把慢开始门限ssthresh设置为此时发送方窗口值的一半(上例中是把发送方窗口值24修改为12)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。

这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

3、快恢复和快重传
快重传:如果发送端接收3个以上的重复ACK,不需要等到重传定时器溢出就重新传递。快重传之后,走的不是慢启动而是拥塞避免算法,所以这又叫快速恢复算法。

意在快速恢复丢失的数据报。
在这里插入图片描述在这里插入图片描述

  1. 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
  2. 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

TCP协议一些问题

1、TCP与UDP的概念区别及优劣

  • TCP面向连接,UDP面向无连接
  • TCP面向报文,UDP面向字节流
  • TCP提供可靠传输服务(数据顺序、正确性),UDP传输不可靠
  • TCP协议传输速度慢,UDP传输速度快
  • TCP协议对系统资源要求多(首部开销大),UDP协议要求少

2、TCP、UDP为什么存在伪首部?
UDP(TCP)检验和:是根据UDP(TCP)数据报和伪首部计算得到的差错检测值。
伪首部包含源和目的IP地址,以及来自IP数据报报头的协议值。IP数据报在网络中传送时包含UDP数据报。
伪首部并不会在网络中传送,校验和中所包含的伪首部内容可以避免目的端错误地接收错误地路由地数据报。

3、为什么要3次握手,4次挥手

  • 3次握手:防止已过期的连接请求报文突然又传送回服务器,因而产生错误。
  • 4次挥手:是为了确保数据能够完成传输,但关闭连接时,当收到对方的FIN报文通知时,他仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你未必会马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

4、TCP释放连接时为什么time_wait状态必须等待2MSL时间?

  • 为了保证A最后发送的一个ACK报文能够到达B。这个ACK报文有可能丢失,因而处理LAST-ACK状态的B收不到已发送FIN+ACK报文段的确认。B会超时重传这个报文段,而A能在2MSL时间内收到这个重传的报文段。如果A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后就立即释放连接,就无法收到B重传的FIN-ACK报文段,因此也不会重发一次确认报文段,那么B就无法按照正常的步骤进入CLOSED状态。
  • A再发送完ACK报文段之后,在经过2MSL时间,就可以使得本连接持续时间所产生的所有报文段都在网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

应用场景

1、UDP

  • 需要资源少,网络稳定的内网,或者对于丢包不敏感的应用
  • 不需要要一对一沟通,建立连接,而是可以广播的应用。
  • 需要处理速度比较快,可以容忍丢包,计师网络拥塞,也毫无退缩,一往无前

例子:

  • 直播:宁可丢包,也不要卡顿
  • 实时游戏:采用自定义的可靠的UDP协议,自定义重传策略,降低延迟
  • QQ语音、QQ视频

2、TCP

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。


参考:
https://blog.csdn.net/sinat_383521889/article/details/79053409#t0
https://blog.csdn.net/xuzhangze/article/details/80490362

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值