计算机网络传输层

计算机网络传输层

在这里插入图片描述

传输层提供的服务

传输层的功能

  • 传输层向应用层提供通信服务,属于面向通信的最高层,也是用户功能的最低层。它为运行在不同主机的进程之间提供了逻辑通信,而网络层则是不同主机之间的网络通信,即使网络层协议不可靠,传输层同样能为应用程序提供给可靠的服务。

  • 网络边缘部分的两台主机使用网络核心部分的功能进行端到端通信,只有主机的协议栈才有传输层和应用层,而路由器转发分组用了下三层的功能,如图:
    在这里插入图片描述

  • 功能:
    ①传输层提供应用进程之间的逻辑通信,而网络层提供主机之间的逻辑通信。(应用进程之间的通信实际是“端到端的逻辑通信”,实际上逻辑通信就是好像沿着水平方向传输数据,但物理上并没有一条物理连接。)
    ②复用和分用:复用指的是发送方不同应用进程都可以使用同一个传输层协议传输数据。分用指的是接收方的传输层剥去报文的首部之后能够把这些数据正确交付到目的应用进程。(网络层也有复用分用,复用是把发送方不同协议数据都可以封装成IP数据报发送出去,分用是把接收方的网络层剥去首部后把数据交付给相应协议。)
    ③传输层还要对收到的报文进行差错检测(首部和数据部分),而网络层只监测IP数据报的首部,不检查数据部分。
    ④提供两种不同协议UDP和TCP,而网络层无法同时实现两种协议。(要么面向连接虚电路,要么无连接数据报。)

传输层的寻址与端口

  • 端口的作用:
    ①端口可以让应用层的各个应用进程将其数据通过该端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层的相应进程。端口就是传输层服务访问点(TSAP),它在传输层作用类似于IP地址在网络层/MAC地址在数据链路层,只不过IP/MAC标记的是主机,而端口标识的是主机中的应用进程。
    ②硬件端口是不同硬件设备进行交互的端口,软件端口是应用层各种协议进程与传输实体进行层间交互的一种地址。
  • 端口号:
    应用进程之间通过端口号进行标识,长度为16比特,能够标识2的16次方个进程,只有本地意义,即端口号只标记本计算机应用层的各种进程,分两类:
    ①服务器端使用的端口号,又分为两类:一类是熟知端口号,0——1023,派发给最重要的应用程序,另一类是等级端口号,1024——49151,提供给其他应用程序使用。
    一些熟知端口号:FTP——21,TELNET——23,SMTP——25,DNS——53,TFTP——69,HTTP——80,SNMP——161。
    ②客户端使用的端口号,49152——65535。由于这类端口号仅在客户进程运行时才动态选择,又称为短暂端口号,通信结束后更用过的客户端端口号不复存在,该端口就可以重新使用。
  • 套接字:
    IP标识不同主机,端口号标识不同进程,则端口号拼接到IP地址即套接字。
    socket=(IP地址:端口号)

无连接服务与面向连接服务

  • TCP是面向连接的服务,在传送数据之前必须建立连接,数据传送结束后释放连接,不提供组播/广播,不可避免的增加许多开销(确认,流量控制,计时器,连接管理),适用于可靠性更重要的场合,如:文件传输协议FTP,超文本传输协议HTTP,远程登录TELNET等。
  • UDP是无连接的非可靠传输层协议,它在IP上仅附加两个服务:多路复用和对数据的错误检查。IP知道投放哪个主机但不知道哪个进程。UDP比较简单,因此执行速度快,实时性好,如:小文本传送协议TFTP,DNS,SNMP,实时传输协议RTP等。
  • IP数据报和UDP数据报区别:IP数据报在网络层要经过路由存储转发,而UDP数据报在传输层端到端的逻辑信道中传输,封装成IP数据报在网络层传输时对外不可见。
  • TCP和网络层虚电路区别:TCP报文在传输层抽象的逻辑信道中传输,对路由器不可见,虚电路经过交换节点必须保存虚电路状态信息,则网络层使用虚电路则无法提供无连接服务,而传输层采用TCP不影响网络层提供无连接服务。

UDP协议

UDP数据报

  • UDP概述:
    UDP是无连接的非可靠传输层协议,它在IP上仅附加两个服务:多路复用和对数据的错误检查,应用程序几乎直接与IP打交道。
    优点:
    ①无须连接,没有建立连接时延。
    ②无连接状态,不跟踪确认等参数,因此使用UDP的时候可以支持更多的活动客户机。
    ③分组首部开销小,TCP有20B的首部开销,UDP只有8B的开销。
    ④应用层更好控制要发送的数据和发送时间。
    ⑤支持1-1,1-N,N-1,N-N的服务。
    常用于一次性传输较少的网络应用,如DNS,SNMP等,如果用TCP则开销大(数据少性价比低)。UDP常用于多媒体应用等,因为可靠性不是最重要的,实时性才是。
    UDP不保证可靠传输,不意味着应用对于数据要求是不可靠的,维护可靠性工作交给应用层来做。
    UDP是面向报文的,发送方UDP对应用层交下来的报文,在添加首部之后就向下交付给IP层,一次发送一个报文,不合并不拆分,保留报文边界。一次交付一个完整报文,因此报文不可分割,是UDP数据报的最小单位。因此应用程序必须选择大小合适的报文,太长则会分片,太短则首部相对太长,两者都会降低IP层的效率。
  • UDP首部格式:
    首部有8B,四个字段组成,每个长为2B:
    ①源端口:源端口号,需要对方回信的时候,不需要可以为0。
    ②目的端口:目的端口号,在终点交付报文时必须用到。
    ③长度:UDP数据报长度,最小数8(仅有首部,没有数据)。
    ④校验和:监测UDP数据报传输中是否出错,出错丢弃,当不想校验时可使字段为0。
    在这里插入图片描述

当传输层从IP获得UDP数据报的时候,就根据首部中目的端口号传送给相应端口进行分用。如果UDP发现收到端口号不正确,则丢弃该报文且由ICMP发送“端口不可达”给发送方。

UDP校验:

计算校验和时,需要在UDP首部加上12B伪首部,得到一个临时UDP数据报,单纯为了计算校验和。检查首部和数据部分。
在这里插入图片描述

计算过程:
发送方把全0放入校验和字段并添加伪首部,把UDP数据报视为许多16位字符串连接起来,若UDP数据报数据部分不是偶数个字节,需要填充一个全0字节(但不发送),按照二进制反码运算16位字的和,把此和的二进制反码写入校验和字段并发送。
接收方收到UDP数据报加上伪首部后,按二进制反码求16位字的和,无差错则全是1,否则有差错丢弃数据报。
在这里插入图片描述

注意:
校验时,若UDP数据报数据部分长度不是偶数,则填充一个偶数字节。
这种检错能力不强,但优点是简单,处理速度快。

TCP协议

TCP协议特点

  • TCP在不可靠IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠,有序,无丢失,不重复,特点如下:
    ①TCP是面向连接的。
    ②每条TCP只有两个端点,只能是点对点的。
    ③TCP传输的可靠,有序,无丢失,不重复。
    ④TCP提供全双工通信,两端都有发送和接收缓存,临时存放双向通信的数据。
    其中发送缓存存放的是:①发送应用程序传送给发送发TCP准备发送的数据。②TCP以发送但尚未收到确认的数据。
    接收缓存存放的是:①按序到达但未被接收应用程序读取的数据。②不按序到达的数据。
    ⑤TCP是面向字节流的,虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅视为玉莲船的无结构的字节流。
  • TCP和UDP在发送报文时采用的方式完全不同,UDP报文的长度由发送应用程序决定,而TCP报文长度则根据接收方给出的窗口值和当前网络拥塞程度来决定。如果应用程序传送到TCP缓存数据块太长了,TCP就把它划分短一些再传送,太短也可以积累到组成够多字节再组成报文段发送出去。

TCP报文段

  • TCP传送的数据单元是报文段,既可以来运送数据,又可以建立连接,释放连接和应答。一个TCP报文段分为首部,数据两部分,整个TCP报文段作为IP数据报的数据部分。首部前20B都是固定的,最短20B。
    在这里插入图片描述

  • 各个字段意义:
    源端口和目的端口:各占2B,端口是运输层和应用层的服务接口,运输层的复用和分用都需要通过端口实现。
    序号:占4B,一共2的32次方个序号,TCP面向字节流,所以每个字节都需要按顺序编号,指的是本报文段所发送的数据的第一个字节的序号。
    确认号:占4B,期望收到对方下一个报文段的第一个数据字节的序号,若确认号为N,咋表明N-1的所有数据都已经正确收到。
    数据偏移:占4位,指出TCP报文段数据起始位置距离TCP报文段的起始处有多远。单位是32位,因此字段为15的时候,TCP首部最大长度是60B.
    保留:占6位,保留位今后使用,先置为0.
    紧急位URG:为1时标识紧急指针字段有效,告诉系统此报文段由紧急数据,应尽快传送,但需要配合紧急指针使用,即数据从第一个字节到紧急指针所指字节就是紧急数据。
    确认位ACK:仅当ACK=1时确认号字段才有效,当为0的时候,确认号无效。TCP规定,连接建立之后所有报文段都是ACK=1。
    推送位PSH:接收方TCP收到PSH=1的报文段,尽快把它交付给应用程序,不等到缓存充满再交付。
    复位位RST:RST=1时表明TCP连接中出现严重差错,必须释放连接,然后再重新连接。
    同步位SYN:SYN=1时表明这是一个连接请求,当SYN=1且ACK=0的时候表明这是一个请求连接报文,对方同意连接则响应报文中SYN=1,ACK=1。
    终止位FIN:释放一个连接,当FIN=1,表明此报文段的发送方的数据以及发送完毕,并要求释放连接。
    窗口:占2B,指出现允许对方发送的数据量,接收方的数据缓存有限,因此用窗口值作为接收方让发送方设置其发送窗口的依据。(设为1000,说明接收缓存空概念还有1000字节数据)
    校验和:占2B,校验和检验数据部分和首部,和UDP一样,加入12B的伪首部。
    紧急指针:占2B,紧急指针仅在URG=1时有意义,指出在本报文段中紧急数据共多少字节。
    选项:长度可变,TCP最初只规定了一个选项,即最大报文长度MSS。(数据部分最大长度)
    填充:为了使得整个首部长度是4B的整数倍。

TCP连接管理

  • 三个阶段:连接建立,数据传送,连接释放。TCP连接的管理就是使运输连接的建立和释放都能正常进行。
  • TCP连接建立过程,解决三个问题:
    ①使得每一方都能够确知对方存在。
    ②允许双方协商一些参数。
    ③能够对运输实体资源进行分配。
    TCP连接两端的端口为套接字socket或插口,每条TCP被唯一的两个套接字确定,采用C/S方式,主动发起连接建立的应用进程称为客户Client,而被动等待连接建立的应用进程称为服务器Server。
  • TCP连接建立:“三次握手”
    在这里插入图片描述

连接建立之前,服务器进程属于LISTEN状态等待客户连接请求。
①客户机的TCP首先向服务器的TCP发送连接请求报文段,这个特殊报文段的首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段不可以携带数据,但要消耗掉一个序号。这时,TCP客户端进程进入SYN-SENT状态。
②服务器的TCP收到连接请求报文段后,如果同意连接,则向客户机发挥确认,并为该TCP连接分配缓存和变量。在确认报文段中,把SYN和ACK都置为1,确认号是ack=x+1,同时也为字节选择的一个初始序号seq=y。注意,确认报文段不能携带数据,但也消耗一个序号。这时,TCP服务器进程进入SYN-RCVD状态。
③当客户机收到确认报文的时候,还要向服务器给出确认,并且为该TCP分配缓存和变量,确认报文段的ACK为1,确认号ack=y+1,序号为seq=x+1。该报文段可以携带数据,若不携带数据则不消耗序号。这时TCP客户进程进入了ESTABLISHED状态。
之上三步就连理了TCP连接,接下来就可以传送应用层数据了,全双工通信。值得注意的是:服务器端分配资源是在第二次握手的时候分配的,客户端的资源是在第三次握手时分配的。

  • TCP连接的释放:“四次挥手”
    在这里插入图片描述

①客户机打算关闭连接,向TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接,该报文端的终止位FIN=1,序号seq=u,它等于前面已经传送过的数据的最后一个字节的序号+1,FIN报文段即使不携带数据,也消耗掉一个序号。这时,TCP客户进程进入FIN-WAIT-1状态,但TCP全双工,即一条TCP连接上有两条数据通路,发送FIN的一端不可以发送数据,即关闭了一条数据通路,但对面还可以发送数据。
②服务器收到连接释放报文段后即发出确认,确认号ack=u+1,序号seq=v,等于前面已经传送过的数据的最后一个字节的序号+1,然后服务器进入CLOSE-WAIT状态,此时从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态,但服务器若发送数据,客户机仍要接受,即从服务器到客户机这个方向的连接并未关闭。
③若服务器已没有要向客户机发送的数据,就通知TCP释放连接,此时发出FIN=1的连接释放报文段,设该报文段的序号为w,还须重复上次已经发送的确认号ack=u+1。这时服务器进入LAST-ACK状态。
④客户机收到连接释放报文段之后,必须发出确认,把确认报文段中的确认位ACK置为1,确认号ack=w+1,序号seq=u+1.此时TCP连接还未释放,必须经过时间等待计时器设置的时间为2MSL(最长报文段寿命)后,客户机才进入CLOSED状态。

  • 总结:
    在这里插入图片描述

TCP可靠传输

保证接收方进程从缓存区读取的字节流和发送方发出的字节流完全一致。使用了校验,序号,确认,重传的机制来达到这个目的(校验和UDP一样,不赘述)。

  • 序号:
    TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。每个字节都有编号,但序号字段指的是本报文所发送的数据的第一个字节的序号。
  • 确认:
    TCP首部的确认号是期望收到对方下个报文段的数据的第一个字节的序号,TCP默认使用累计确认,即只确认数据流中至第一个丢失字节为止的字节。(即使已经收到了6-7字节,但3字节丢失,确认号仍然是3)
  • 重传:
    有两种事件导致TCP对报文段进行重传:超时和冗余ACK。
    ①超时:
    TCP每发送一个报文段,就会设置一次计时器,重传时间到期仍未收到确认就重传。
    由于路由选择变化大,时延方差很大,所以为了计算重传时间,TCP使用自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间(RTT),保留RTT加权平均往返时间RTTs,随着样本变化而变化,显然超时计时器设置的超时重传时间RTO应该略大于RTTs,但也不能太多,否则丢失时不能很快重传,导致数据传输时延过大。
    ②冗余ACK:
    超时重传存在问题就是超时周期太长。但发送方可以在超时事件发生前通过注意所谓的荣誉ACK来较好地监测丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方已经受到过该报文段的确认。TCP规定每当比期望序号大的失序报文段到达的时候,就发送i给冗余ACK,指明下一个期待字节的序号。当收到同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失,这属于快速重传技术。

TCP流量控制

  • TCP流量控制来消除发送方使接收方缓冲区溢出的可能性,因此可以说流量控制是一个速度匹配服务。提供一种基于滑动窗口协议的流量控制机制,在通信过程中,接收方根据字节接收缓存的大小,动态调整发送方的发送窗口大小,这称为接收窗口rwnd,即调整TCP报文段首部中的“窗口”字段值,限制发送方向网络注入报文速率,同时发送方根据对齐当前网络拥塞程度估计而确定窗口值,称为拥塞窗口cwnd,其大小与网络带宽和时延密切相关。
    在这里插入图片描述

  • 传输层和数据链路层的流量控制区别:
    传输层定义端到端之间的流量控制,数据链路层定义两个中间相邻结点之间的流量控制,且数据链路层滑动窗口协议的窗口大小不能动态变化,而传输层的可以动态变化。

TCP拥塞控制

  • 拥塞控制是防止过多的数据注入网络,保证网络中的路由器/链路不至于过载。
  • 拥塞控制与流量控制区别:拥塞控制让网络能够承受现有的网络负荷,是一个全局性过程,涉及所有的主机,路由器,以及与降低网络传输性能有关的所有因素,相反,流量控制则是点对点通信量控制,是端到端的维妮塔,只要抑制发送方速率以便于接收方来得及接收。
  • 因特网定义了拥塞控制的4种算法:慢开始,拥塞避免,快重传,快恢复。
  • 发送方确定发送报文段速率的时候,既要根据接收方接收能力,又要全局考虑不要使网络发生拥塞,因此TCP协议要求发送方维护以下两个窗口:
    ①接收窗口rwnd,接收方根据目前接收缓存大小所许诺的最新窗口值,反映接收方的容量,由接收方根据其放在TCP报文的首部窗口字段通知发送方。
    ②拥塞窗口cwnd,发送方根据自己估算的拥塞程度而设置的窗口值,反映当前容量,只要网络未出现拥塞,就可以把拥塞窗口再增大一些,以便把更多的分组发送出去,但只要网咯出现拥塞,拥塞窗口就减小一些。
    ③发送窗口上限=两者中小的那个。
  • 慢开始:
    当TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd=1,即一个最大报文段长度MSS,每收到一个对新报文段的确认cwnd就加一。这个慢开始的“慢”并不是cwnd增加速度慢,而是开始先发送第一个报文段,然后开始逐渐增大cwnd,这对防止网络出现拥塞是一个非常有力的措施。使用慢开始算法后,每经历一个RTT,cwnd都会加倍,即指数型增长,这样,慢开始增到一个规定的慢开始门限ssthresh,然后改用拥塞避免算法。
  • 拥塞避免算法:
    思路就是让拥塞窗口cwnd缓慢增大,具体做法是,没经历一个RTT,要把发送方的拥塞窗口+1,而不是加倍,线性缓慢增长,根据cwnd大小执行不同算法,可归纳如下:
    ①cwnd小于ssthresh,使用慢开始算法。
    ②cwnd大于ssthresh,停止使用慢开始算法改用拥塞避免算法。
    ③cwnd等于ssthresh,两者均可以使用,通常使用拥塞避免算法。
  • 网络拥塞处理:
    无论慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(未按时收到通知),就要把慢开始门限ssthresh设置为拥塞发送方的cwnd值的一半,然后把cwnd重新设置为1,执行慢开始算法,目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完。
    在这里插入图片描述

拥塞控制不能完全避免,是使网络不容易出现拥塞。

  • 快重传:
    快重传使用冗余ACK监测丢包发生,而且冗余ACK也用于网络拥塞,当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待报文段重传计时器。

  • 快恢复:
    原理:当发送方连续收到三个重复的ACK报文时,执行“乘法减小”算法,把慢开始门限ssthresh设置为此时发送方cwnd的一半。这是为了预防网络发生拥塞,但放生发认为现在网络没有发生拥塞,否则不会有几个报文段连续到达接收方,也不会连续收到重复确认,因此与慢开始不同的是,它把cwnd值设置为慢开始门限ssthresh改变后的数值,然后开始执行拥塞避免算法(“加法增大”),跳过了从cwnd=1开始过程,所以称为“快恢复”。
    在这里插入图片描述

  • 总结:TCP建立连接和网络超时时,采用慢开始和拥塞避免,当发送发接收到冗余ACK时,采用快重传和快恢复。快重传和快恢复是对慢开始和拥塞避免的一种改进。

小结

  • MSS设置太小,:网络利用率很低,如果TCP报文段只有1B数据,40B首部,则效率小于1/41,到了链路层还要进行开销,利用率进一步降低。
    MSS设置太大:IP层传输进行分片,终端还要重组,传输有差错还要进行重传,都会增大开销。
    所以,MSS应该尽量大些,只要到IP层不需要分片就行,最佳MSS很难确定,一般默认536B。
  • 最后一次挥手等待2MSL时间:
    ①保证A发送的最后一个确认报文段能够到达B,如果A不等待2MSL,若A返回最后确认报文段丢失,B就不能进入正常关闭状态,而A已经关闭无法重传。
    ②防止出现“已失效的连接请求报文段”,A发送最后一个确认报文段后,经过2MSL保证本连接持续时间内所有报文段从网络中消失。
  • TCP和GBN区别:TCP正确收到但失序的报文不会丢弃而是缓存起来,并且发送冗余ACK指明期望收到的下一个报文段。而GBN就丢弃了。
  • 超时时间之后cwnd变为1,是因为拥塞程度更严重。
    收到3个冗余ACK时cwnd减半,因为拥塞程度不是很严重,能收到冗余ACK。
  • 为什么不用“两次握手”建立连接?
    为了防止两次握手情况下,已经失效的连接请求突然传送到服务器而产生错误。如果客户A向服务器B发出TCP连接请求,第一个连接请求报文长时间滞留,A超时认为丢失则重传,B收到之后建立连接,数据传输完毕断开连接,此时这个丢失的连接请求到达服务器B,而B认为A又发来连接请求,若使用“三次握手”,则B向A返回确认报文段,由于是一个失效的请求,因此A不予理睬,建立连接失败。
  • TCP每次建立连接选择初始序号一定和前面的一些连接所用的序号不同。
  • 若网络不发生错误,无差错,TCP是不是多余?
    不多余!!!
    ①数据到达目的结点会失序。
    ②由于路由计算错误,IP数据报在互联网中转圈,TTL=0,被丢弃。
    ③某个路由器通信量大处理不及时,有的数据报被丢弃。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值