第五章 传输层
5.1 传输层概述
传输层的意义
网络层可以把数据从一个主机传送到另一个主机,但是没有和进程建立联系。
传输层就是讲进程和收到的数据联系到一起,使数据能够为应用服务
所以说传输层是主机才有的层次
传输层的功能:
- 传输层提供进程和进程之间的逻辑通信
- 复用和分用
- 传输层对收到的报文进行差错检测
- 传输层的两种协议
传输层的两个协议
-
面向连接的传输控制协议TCP
可靠,面向连接,时延大,适用于大文件
-
无连接的用户数据报协议UDP
不可靠,无连接,时延小,适用于小文件
传输层的寻址与端口
- 复用:应用层所有的应用进程都可以通过传输层再传输到网络层
- 分用:传输层从网络层收到数据后交付知名的应用进程
逻辑端口/软件端口是传输层的SAP,标识主机中的应用进程
端口号只有本地意义,在因特网中不同的计算机的相同端口是没有联系的
端口号长度为16bit,能表示65536个不同的端口号
端口号(按范围分)
- 服务端使用的端口号
- 熟知端口号(0-1023):给TCP/IP最重要的一些应用程序,让所有用户都知道
- 登记端口号(1024-49151):为没有熟知端口号的应用程序使用的。
- 客户端使用的端口号(49152-65535):仅在客户进程运行时才动态选择
5.2 UDP协议
UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能
特点:
- UDP是无连接的,减少开销和发送数据之前的时延
- UDP使用最大努力交付,即不保证可靠交付
- UDP是面向报文的,适合一次性传输少量数据的网络应用
- UDP无拥塞控制,适合很多实时应用
- UDP首部开销小,8B,TCP ,20B
UDP首部格式
UDP校验
在发送端的时候:
1.就是将每一行(4字节)拆成两部分,左右平均2字节大小,将这两字节数据写成二进制,那么2字节一共就需要2*8=16位。此时检验和没有计算,默认填充0,同时如果数据字段不整齐,则用0补齐,这样就可以写出几十行二进制数,如图中方所示
2.计算着几十行二进制数按二进制反码运算求和,二进制反码运算可以参考
二进制反码求和运算
得到的最后简介再反码,之后将反码之后的放入原来的检验和字段
在接收端的时候
与发送端的时候不同的是,此时检验和字段不是0了
按照发送端的步骤再将所有数据写成二进制进行二进制反码运算求和
如果最后得到结果全1就是没问题,否则丢弃
5.3.1 TCP协议特点和TCP报文段格式
TCP协议特点
- TCP是面向连接(虚连接)的传输层协议。
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
- TCP提供可靠交付服务,无差错、不丢失、不重复,按序到达。
- TCP提供全双工通信。(发送缓存、接收缓存)
- TCP面向字节流。(TCP把应用程序交下来的数据看成仅仅是一连串的无结构字节流)
TCP报文段首部格式
注释:
见上图,可以看到TCP是将数据随机分割后加上TCP头传输的,所以
序号就是为了标记这些随机分割之后的数据,这里把第一个字节的编号当成序号
确认号就是收到之后做一下标记,代表这之前的都收到了,希望收到的下一个编号的数据就是确认号打头的那个数据
偏移量就是为了标记一下距离TCP开始多少字节是数据,这里的单位是4B,这个偏移量就是TCP首部长度
窗口就是接收方告诉发送方,还有多少地方(缓存)可以放数据
紧急指针就是告诉TCP从哪里到哪里是紧急数据
5.3.2 TCP连接管理
TCP连接传输三个阶段
连接建立->数据传送->连接释放
TCP连接的简历采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器
TCP的连接建立
ROUND1:客户端发送连接请求报文段,无应用层数据。
SYN =1 ,seq=x(随机数)
ROUND2:服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据
SYN=1,ACK=1,seq=y(随机),ack=x+1
ROUND3:客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据
SYN洪泛攻击
SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗cPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
TCP的连接释放
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”将被释放
ROUND1:客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接
FIN=1.seq=u
ROUND2:服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了–半关闭状态
ACK=1,seq=v,ack=u+1
ROUND3:服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接
FIN=1,ACK=1,seq=w,ack=u+1
ROUND4:客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭
ACK=1,seq=u+1,ack=w+1
TCP可靠传输
可靠:保证接收方进程从缓存区独处的字节流与发送方发送的字节流是完全一样的。
tcp可靠传输的机制:
-
校验
-
序号
就是TCP根据下方数据链路层的MTU(最大传输单元)来随即将数据切割成好几端并且进行编号
-
确认
发送方每一次发送数据之后都需要接收方进行确认。
TCP使用的是累计确认机制,就是从第一个丢失的字节开始请求丢失的报文段。如图中456丢失,78到达,但仍然请求发送的数据序号是4 -
重传
为什么要使用自适应算法?网络环境太复杂,路径又长又短,RTT设置短了照顾不了距离远的,RTT设置长了又导致网络利用率降低,所以使用RTTs
5.3.4 TCP流量控制
简单来说就是接收方可以动态的发送信息告诉发送方发送窗口的大小。
接收方接受不过来了就让发送方发送窗口小点,这样发送方发送的速率就慢下来了,接收方就有时间处理它的数据了
接受方处理完了也可以发送请求让发送方发送窗口大点,这样发送方发送的速率就快起来了,接收方就可以处理更多数据而不是空闲等着收数据了
5.3.5 TCP拥塞控制
计算机网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中资源的需求超过了可用的资源,若网络中许多资源同时供应不足,网络的性能就会变坏,整个网络的吞吐量随之负荷的增大而下降。,这种情况就叫做拥塞。
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。和流量控制不同,流量控制指点对点通信量的控制。
拥塞控制四种算法
慢开始( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。
- 慢开始和拥塞避免
发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
慢开始算法:当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。因此,较好的方法是 先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为1。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至原来的2倍。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可以使分组注入到网络的速率更加合理。
拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。
2.快重传和快恢复
这里和上面的慢开始和拥塞避免的一开始步骤差不多,都是先指数增长再转变为线性增长。
不同的点是快重传和快恢复算法是在收到连续的ack确认之后执行,这里的ack就是冗余ack,冗余ack的特点是如果多次对某一段请求的数据没有被收到,达到一定数目之后就会立即执行重传。但是此时只是降到现在cwnd的一半,再重新线性增长。而不是像慢开始和拥塞避免的从头开始