0%

传输层

传送层的功能

传输层属于面向通信部分的最高层,同时也是用户功能中的最底层。(注意通信子网没有传输层)

复用和分用

复用是指发送方不同的应用进程都可使用同一个传输层协议传送数据:分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。

传输层的寻址和端口

端口的作用

端口是传输层服务访问点,端口标识的是主机中的应用进程

数据链路层的服务访问点(SAP)是MAC,网络层的SAP是IP地址,传输层的SAP是端口。

端口号

端口号长度为16bit,能够表示65536(0~65535)个不同的端口号。端口号只有本地意义,即端口号只表示本计算机应用层中的各进程,在因特网中不同计算机的相同端口号是没有联系的。根据端口号范围可将端口分为两类:

1、服务端使用的端口号。这里又分为两类,最重要的一类是熟知端口号,数值为0~1023,IANA(互联网地址指派机构)把这些端口指派给了TCP/IP最重要的一些应用程序,让所有的用户都知道。另一类称为登记端口号,数值为1024~49151。它是供没有熟知端口号的应用程序使用的。使用这类端口号必须在IANA登记。

2、客户端使用的端口号,数值为49152~65535。这类端口号仅在客户进程运行时才动态选择,因此又称短暂端口号(也称临时端口)。通信结束后,刚用过的客户端口号就不复存在,从而这个端口号就可提供其他客户进程使用。

套接字

在网络中采用发送发和接收方的套接字(socket)组合来识别端点。套接字实际上是一个通信端点,套接字=(主机IP地址,端口号)。它唯一地标识网络中的一台主机和其上的一个应用(进程)

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

TCP/IP协议族在IP层之上使用了两个传输协议:一个是面向连接的传输控制协议(TCP),采用TCP时,传输层向上提供的是一条全双工的可靠逻辑信道;另一个是无连接的用户数据报协议(UDP),采用UDP时,传输层向上提供的是一条不可靠的逻辑信道。TCP不提供广播和组播服务

UDP

UDP只是做了传输协议能够做的最少工作,它仅在IP和数据报服务之上增加了两个最基本的服务:复用和分用以及差错检查。

UDP具有以下优点:

1、UDP无须建立连接,因此UDP不会引入建立连接的时延。

2、无连接状态。UDP不维护连接状态。

3、分组首部开销小,TCP有20B的首部开销,而UDP只有8B的开销。

4、应用层能更好地控制要发送的数据和发送时间。UDP没有拥塞控制,因此网络中的拥塞不会影响主机的发送效率。某些实时应用要求以更稳定的速度发送,能容忍一些数据的丢失,但不允许有较大的时延,而UDP正好满足这些应用的需求。

UDP是面向报文的。发送方UDP协议对应用层交下来的报文,在添加首部后就向下交付给IP层,既不合并,也不拆分,而是保留这些报文的边界;接收方UDP对IP层交上来UDP用户数据报在去除首部后就原封不动地交给上层应用程序,一次交付一个完整的报文。因此报文不可分割,是UDP数据报处理的最小单位。

UDP的首部格式

2b8fed7f7a91118fbcbef80137bcebc8.jpeg

UDP首部有8B,由4个字段组成,每个字段的长度都是2B。

1、源端口。源端口号,在需要对方回信时选用,不需要时可用0.

2、目的端口。目的端口号,这在终点交付报文时必须使用到。

3、长度。UDP数据报的长度(包括首部和数据),其最小值为8(仅有首部)

4、校验和。校验首部和数据部分,检测UDP数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算校验和,则直接令该字段为0。

如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应端口号的应用程序),那么就丢弃该报文,并由ICMP发送“端口不可达”差错报文给发送方。

UDP校验

在计算校验和的时,要在UDP数据报之前增加12B的伪首部,得到临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。伪首部既不向下传送也不向上传递c557e6b203553e314753972f16d00b78.jpeg

发送方首先把全0放入校验和字段并添加伪首部,然后把UDP数据报视为许多16位的字连接起来。若UDP数据报的数据部分不是偶数字节,则要在数据部分末尾添加一个全0字节(次字节最后不会发送,仅在计算校验和时使用)。计算校验和时,采用二进制反码计算再求反码,最后结果作为校验和。

接收方把收到的UDP数据报加上伪首部(如果不是偶数个字节,那么还需要补上全0字节),按二进制反码计算出校验和。当无差错时结果应全为1,否则表明有差错出现。

TCP

TCP协议的特点

1、TCP是面向连接的传输层协议

2、每条TCP连接只能是点对点的(一对一)

3、TCP提供可靠的交付服务,保证传送数据的无差错、不丢失、不重复且有序

4、TCP提供全双工通信,为此TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据

5、TCP是面向字节流的,TCP把应用程序交下来的数据仅视为一连串的无结构的字节流

TCP数据报

TCP传送的数据单元称为报文段,其首部的前20B是固定的。TCP报文段的首部最短为20B,后面有4N字节是根据需要而增加的选项,通常为长度的整数倍。

536fcd6dbc7d56f295a5364e1186693e.jpeg

  • 源端口和目的端口字段。各占2B。

  • 序号字段。占4B。TCP连接传送的数据流中的每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号

  • 确认号字段。占4B,是期望收到对方的下一个报文段的数据的第一个字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到

  • 数据偏移(即首部长度)。占4位,数据偏移的单位为4B。因此当字段的值为15时,达到TCP首部的最大长度60B

  • 保留字段。占6位,保留为今后使用,但目前应置值为0,该字段可以忽略不计。

  • 紧急位URG。URG=1时,表明紧急指针字段有效。它告诉系统报文段中有紧急数据,应尽快传送,但URG需要和紧急指针配套使用,即数据从第一个字节到紧急指针所指字节就是紧急数据。

  • 确认位ACK。只有当ACK=1时确认号字段才有效。在建立连接后所有传送的报文都必须把ACK置为1

  • 推送位PSH(Push)。接收TCP收到PSH=1的报文段,就尽快交付给接收应用程序,而不再等到整个缓存都填满后再向上交付。

  • 复位位RST(Reset)。RST=1时,表明TCP连接中出现严重的差错,必须释放连接,然后再重新建立传输连接。

  • 同步位SYN,SYN=1时表示这是一个连接请求或连接接收报文

  • 终止位FIN(Finish)。用来释放一个连接。FIN=1表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。

  • 窗口字段。占2B。它指出现在允许对方发送的数据量,窗口值作为接收方让发送方设置其发送窗口的依据,单位为字节。

  • 校验和。占2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需要将UDP伪首部的第4个字段,即协议字段的17改成6,其他的和UDP一样)

  • 紧急指针字段。占16位,指出在本报文段中紧急数据共有多少字节(紧急数据放在本报文段数据的最前面)

  • 选项字段。长度可变。TCP最初之规定了一种选项,即最大报文段长度(Maximum Segment Size, MSS)。MSS是TCP报文段中的数据字段的最大长度。

  • 填充字段,填充字段。这是为了整个首部长度是4B的整数倍。

TCP连接管理

TCP是面向连接的协议,因此每个TCP连接都有三个阶段:连接建立、数据传送和连接释放。在TCP连接建立的过程中,要解决以下三个问题:

1、要使每一方都能够确知对方的存在。

2、要允许双方协商一些参数(如最大窗口值,是否使用窗口扩大哦选项、时间戳选项及服务质量等)

3、能够对运算实体资源(如缓存大小、连接表中的项目等)进行分配

TCP连接的端口称为套接字(socket)。每条TCP连接唯一地被通信两端的两个套接字确定。TCP连接中,主动发起连接建立的应用进程称为客户机(Client),而被动等待建立的应用程序称为服务器(Server)

连接的建立

TCP连接的建立要经历以下3个步骤,通常称为三次握手。

47d7cdc1abe00d8c2c24b70a4187972b.jpeg

第一步:客户机TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含有应用层数据,其首部中的ACK=0,SYN=1。另外,客户机会随机选择一个起始序号seq=x(连接请求报文不携带数据,但要消耗一个序号)

第二步:为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+1,并且服务器随机产生起始序号seq=y(确认报文不携带数据,但也要消耗一个序号)

第三部:当客户机收到确认报文段,还要向服务器给出确认,并且也要给连接分配缓存和变量。这个报文段的ACK=1,seq=x+1。该报文段可以携带数据

由于服务器端的资源是在完成第二次握手时分配的,所以服务器易收到SYN洪泛攻击。

TCP连接的释放

TCP连接释放的过程通常称为四次挥手

6b05fd7b1e103d89e8b7f3c89c52319e.jpeg

第一步:客户机打算关闭连接时,向其TCP发送一个连接释放报文段,并停止发送数据。该报文段的ACK=1,FIN=1,seq=u,它等于前面已经发送过的数据的最后一个字节的序号+1(FIN报文段即使不携带数据,也要消耗一个序号)。发送FIN报文时,发送FIN的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据

第二步:服务器收到连接释放报文段后发出确认,确认号是ack=u+1,而这个报文段的自己的序号v,等于它前面已传送过来的数据的最后一个字节的序号+1。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。

第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出FIN=1的连接释放报文段。

第四步:客户机收到释放连接报文段后,必须发出确认。在确认报文段中,ACK=1。此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL(Maximum Segment Lifetime,最大分节生命期后,这是一个IP数据包在网络上生存的最长时期),客户端才进入连接关闭状态

TCP可靠传输

TCP提供的可靠传输服务保证接收方进程从缓冲区读出的字节流与发送方发出的字节流完全一样。TCP使用了校验、序号、确认和重传等机制来达到这一目的。

序号

TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。

确认

TCP默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节,例如,接收方收到了发送方字节的0~2字节和6~7字节。由于某种原因,接收方还未收到字节3~5的报文段,此时B仍在等待字节3(和其后面的字节),因此接收方到发送方的下一个报文段将确认号字段置为3。

重传

有两种事件会导致TCP对报文段进行重传

超时

TCP每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。

冗余ACK(冗余确认)

超时触发重传存在的一个问题时超时周期往往太长,冗余ACK可以解决这一问题。冗余ACK就是再次确认某个报文段的ACK。TCP规定每当比期望序号大的失序报文段到达时,就发送一个冗余ACK。TCP规定当发送方收到对同一个报文段的3个冗余ACK时(总共接收4个ACK),就可以认为跟在这个被报文段已经丢失。这种技术通常称为快速重传。

TCP流量控制

在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd,即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。同时,发送方根据其对当前网络拥塞程序的估计而确定的窗口值,这称为拥塞窗口cwnd发送方的发送窗口的实际大小取决于rwnd和cwnd的最小值。

数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层的则可以动态变化

TCP拥塞控制

出现拥塞时,端点并不了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。

拥塞控制与流量控制的区别:拥塞控制是让网络能够成熟现有的网络负荷,是一个全局性的过程,设计所有的主机、所有的路由器。流程控制往往是指点对点的通信量的控制,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。

慢开始和拥塞控制

慢开始算法

在TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd=1,即一个最大报文段长度MSS。每收到一个对新报文段的确认后,将cwnd加1,即一个最大报文段长度MSS。在经过一个RTT后(也称一个传输轮次),拥塞窗口的大小变为一个轮次前的两倍(一个传输轮次中包含多次发送和确认的过程)。

使用慢开始算法后,每经过一个传输轮次(即往返时延RTT),拥塞窗口cwnd就会加倍。这样,慢开始一直把拥塞窗口cwnd增大到一个规定的慢开始门限ssthread(域值),然后改用拥塞避免算法。

拥塞避免算法

发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小,而每当出现一次超时(网络拥塞)时,令慢开始门限ssthread等于当前cwnd的一半。

当拥塞窗口等于阈值时,既可以使用慢开始算法,又可以使用拥塞避免算法(通常做法)。

网络拥塞的处理

网络出现拥塞时,无论是在慢开始阶段还是在拥塞避免阶段,只要发送发检测到超时事件的发生,就要把慢开始门限ssthread设置为出现拥塞时的发送方的cwnd值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。

注意在慢开始阶段cwnd不能跃过ssthread值,也就是说当cwnd * 2 > ssthread时,cwnd = ssthread。

一个例子:

6e8a9b01fa8b423a25e3b7715cd528b7.jpeg

快重传和快恢复

快重传

当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。

快恢复

发送端收到连续三个冗余ACK(即重复确认)时,把慢开始门限ssthread设置为出现拥塞时发送方cwnd的一半,把cwnd的值设置为慢开始门限ssthread改变后的数值(不是变为1),然后开始执行拥塞避免算法(每过一个RTT,cwnd值加1),使拥塞窗口缓慢地线性增大。

由于跳过了cwnd从1开始的慢开始过程,所以被称为快恢复。

一个例子:

176defecda15addb2938ae91681fc889.jpeg

虚线为慢开始的处理过程

在流量控制中,发送方发送数据的量由接收方决定,而在拥塞用控制中,则由发送方自己通过检测网络状况决定。

实际上,慢开始、拥塞避免、快重传和快恢复几种算法应是同时应用在拥塞控制机制中,当发送方检测到超时,就采用慢开始和拥塞避免,当发送方接收到冗余ACK时,就采用快重传和快恢复