TCP/IP(七)运输层

1. 运输层概述

1.1 运输层简介

网络层,数据链路层与物理层实现了网络中主机之间的数据通信,计算机网络的本质活动是实现分布在不同地理位置的主机之间的进程通信,以实现应用层的各种网络服务功能。传输层提供进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。

传输层的主要功能是实现分布式进程之间的通信。利用网络层提供的服务,在源主机的应用进程与目的主机的应用进程建立“端—端”连接。即传输层提供端到端的交换数据的机制,检查分组编号与次序,传输层对其上三层如会话层等,提供可靠的传输服务,对网络层提供可靠的目的地站点信息主要功能。

传输层:只在通信双方的节点上(比如计算机终端)进行处理,而无需在路由器上处理,传输层是OSI中最重要、最关键的一层,是唯一负责总体的数据传输和数据控制的一层;

在这一层,数据的单位称为数据段(segment);

主要功能:

①:为端到端连接提供传输服务

②:这种传输服务分为可靠和不可靠的,其中Tcp是典型的可靠传输,而Udp则是不可靠传输

③:为端到端连接提供流量控制,差错控制,服务质量(QualityofService,QoS)等管理服务

包括的协议如下:

TCP:传输控制协议,传输效率低,可靠性强;

UDP:用户数据报协议,适用于传输可靠性要求不高,数据量小的数据(比如QQ);

DCCP、SCTP、RTP、RSVP、PPTP等协议。

1.2 端口

(1)端口概述

1)网络中,端口号(Port)标识一个主机上进行通信的不同的应用程序,一个进程对应一个端口。

2)IP地址+端口号标识主机上唯一的进程。

3)端口号,占有16位,数值范围在0~65535;

4)熟知端口号列表可以在http://www.iana.org中查询。也可以输入命令catetc/services查看。

5)UDP常用熟知端口号

 

 6)TCP常用熟知端口号

 

 (2)端口分类

1)熟知端口:0-1023,也就是一些固定的端口号;比如http使用的80端口,意思就是在访问网址时,我们访问服务器的端口就是80,然后服务器那边传网页的数据给我们。

2)登记端口:1024-49151,比如微软开发了一个系统应用,该应用在通讯或使用时,需要使用到xxx端口,那么就要去登记一下这个端口,以免有别人公司的应用使用同一个端口号;例如,windows系统中的3389端口,就是用来实现远程连接的,就固定了这台计算机如果要使用远程连接服务,就打开3389端口,别人就能使用远程连接连你,默认是不打开的。

3)客户端端口:49152-65535,一般我们使用某个软件,比如QQ,等其他服务,随机拿这个范围内的端口,而不是去拿前面哪些固定的,拿到等通讯结束后,就会释放该端口。

1.3 协议识别

网络中的两台主机要实现进程通信,他们必须事先约定好传输层的协议类型。

在windows操作系统中,网络环境中的唯一一个进程用三元组标识:

 

 在UNIX操作系统中,网络环境中的唯一一个进程用五元组标识:

 

 注:一个进程可以绑定多个端口号;一个端口号只能绑定一个进程。

补充两个命令的使用:

(1)netstat是一个用来查看网络状态的重要工具。

 

 

 (2)pidof命令查看服务器的进程id。

2. UDP协议

2.1 UDP简述

(1)概述

 

 (2)特点

1)无连接:UDP是一个无连接协议,传输数据之前源端和终端不建立连接,可直接传输数据。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息,支持一对一、一对多、多对一和多对多的交互通信;

UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。

吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。

UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

2)不可靠:是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端,任何必须的可靠性都由应用程序提供。在UDP情况下,虽然可以确保发送消息的大小,却不能保证消息一定会达到目的端。没有超时和重传功能,当UDP数据封装到IP数据报传输时,如果丢失,会发送一个ICMP差错报文给源主机。即使出现网络阻塞情况,UDP也无法进行流量控制。此外,传输途中即使出现丢包,UDP也不负责重发,甚至当出现包的到达顺序杂乱也没有纠正的功能。

但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、显示航空信息等等。UDP也用在路由信息协议RIP(RoutingInformationProtocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中。

3)UDP常用于几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于LAN等特定网络中的应用通信;4.广播通信(广播、多播)。

2.2 UDP报文格式

UDP在IP报文中的位置如图所示:

 UDP报文格式如图所示: 

 

1)UDP首部

源端口号:占16位,源主机的应用进程所使用的端口号;

目标端口号:占16位,目标主机的应用进程所使用的端口号,也就是我们需要通信的目标进程;

UDP(包)报长度:UDP用户数据报的长度,数据部分+UDP首部之和为UDP报长度。

检验和:检验和是为了提供可靠的UDP首部和数据而设计;提供可靠的UDP首部,是因为一个进程可能接受多个进程过来的报文,通过5个东西来进行区分的,“源IP地址”、“目的IP地址”、“协议号”、“源端口号”、“目标端口号”的,这个检测可靠,是检测接受哪个正确的报文,也就是说是哪个报文要进这个端口。之前所提的不可靠,说的是这个报文可能丢失,可能其中数据损坏了。

2)UDP伪首部

就是拿到IP层的一些数据,因为要进行检验和,就必须要有这些数据。其中检验的算法跟IP层中检验首部的办法是一样的。

分析:

 

 一个目标进程中,其中的报文,目标端口,目标ip地址肯定都是一样的,但是源IP地址和源端口就可能不一样,这就说明了不同源而同一目的地的报文会定位到同一队列。

2.3 总结

(1)案例

在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

1)应用层协议中DNS,也就是根据域名解析ip地址的一个协议,他使用的就是UDP

2)DHCP,这个是给各电脑分配ip地址的协议,其中用的也是UDP协议

3)IGMP,我们说的多播,也就是使用的UDP,在多媒体教师,老师拿笔记本讲课,我们在下面通过各自的电脑看到老师的画面,这就是通过UDP传输数据,所以会出现有的同学卡,有的同学很流畅,就是因为其不可靠传输,但是卡一下,对接下来的观看并没有什么影响。

(2)总结

UDP只是做了运输协议能够做的最少工作,除了复用/分解功能及少数的差错检验外,它几乎没有对ip增加别的东西。

术语:主机端的UDP为此报文添加首部字段,然后将形成的报文段交给网络层,网络层将此UDP报文段封装进一个ip数据报中,然后将其发送给一个服务器。

有许多应用更适合使用UDP,原因如下:

  • 关于发送什么数据以及何时发送的应用层控制更加精细(UDP没有拥塞控制);
  • 无需建立连接(无时延);
  • 无连接状态(支持更多活跃用户);
  • 分组首部开销小;
  • 使用UDP是可能实现可靠性数据传输的,需要通过应用程序自身中建立可靠性精致来完成。

3. TCP协议

3.1 TCP协议简述

(1)概述

传输控制协议(TCP,TransmissionControlProtocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

TCP协议是面向连接的、可靠传输、有流量控制,拥塞控制,面向字节流传输等很多优点的协议。其最终功能和UDP一样,在端和端之间进行通信,但是和UDP的区别还是很大的。

(2)特点

1)TCP是面向连接(虚连接)的传输层协议;

需要在端系统中维护连接状态:接收和发送缓存、拥塞控制参数和序号与确认号参数。

2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的:不提供广播或多播服务;

3)TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。可靠有序,不丢不重;

4)TCP提供全双工通信:TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据;

发送缓存:准备发送的数据;已经发送但尚未收到确认的数据。

接收缓存:按序到达但尚未被接收应用程序读取的数据;不按序到达的数据。

5)TCP面向字节流

字节流:流入到进程或从进程流出的字节序列;

TCP和应用程序的交互是一次一个数据块(大小不等),但TCP把应用程序传递下来的数据看成仅仅是一连串的无结构的字节流;

TCP传送时是按照一个一个字节来传送的(但并不是每个报文只传送一个字节);

(3)TCP功能

1)当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。

2)TCP为了保证报文传输的可靠,给每个包一个序号,同时序号也保证传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。在数据正确性与合法性上,TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和;同时可以使用md5认证对数据进行加密。

在保证可靠性上,采用超时重传和捎带确认机制。

3)在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。

4)在拥塞控制上,采用广受好评的TCP拥塞控制算法(也称AIMD算法)。该算法主要包括三个主要部分:1)加性增、乘性减;2)慢启动;3)对超时事件做出反应。

3.2 TCP报文结构

 

 1)源/目标端口号:占16Bit。TCP协议通过使用”端口”来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在”众所周知的端口”(Well-KnowPort)为用户提供服务。

2)序列号:占32Bit。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。因TCP是面向字节流的,它将报文按照一个个字节进行序号编写;本字段表示传输数据的第一个字节相对所有的字节的位置。

3)确认应答:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。若确认号为N,则证明序号N-1为止的所有数据都已正确收到。

4)数据偏移(首部长度)字段,占4位:

表示TCP报文段的数据起始距离TCP报文段的起始处有多远;

以4B(32位)为单位,即1个数值是4B;

此数值最大是15,因此TCP首部最长是60B;

5)保留字段,占6位;保留为以后使用,目前应置0,该字段可忽略不计

6)控制位字段(U、A、P、R、S、F):占6比特:

URG:紧急指针(urgentpointer)有效;当URG为1时,表明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。

ACK:确认,当ACK为1时,确认序号才有效。在TCP连接建立后所有传送的报文段都必须把ACK置为1;当ACK为0时,确认序号没用。

PSH:推送,接收方尽快交付应用程序进程,不再等到缓存填满再向上交付。

RST:复位,报文遇到很严重的差错时,比如TCP连接出错等,会将RST置为1,然后释放连接,全部重新来过。

SYN:为1时,同步程序;表明是一个连接请求/连接接收报文。

FIN:为1时,表明此报文段发送方数据已发完,要求释放连接。

7)窗口:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。指发送报文段一方的接受窗口大小,用来控制对方发送的数据量(从确认号开始,允许对方发送的数据量)。也就是后面需要讲的滑动窗口的窗口大小;

8)检验和:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证;检验时要加上12B伪首部,第四个字段(协议字段)为6;和UDP一样,需要拿到伪首部中的数据来帮助检测;

9)紧急指针字段:占16比特。URG=1时才有意义,指出本报文段中紧急数据的字节数;数据从第一个字节到紧急指针所指字节就是紧急数据。

10)选项:占32比特,长度可变;包括最大报文长度MSS(MaximumSegmentSize);TCP报文中数据字段的最大长度;窗口扩大;时间戳;选择确认等。

11)填充:为了使整个首部的长度是4字节的整数倍。

3.3  TCP连接的建立与终止

三个阶段:连接建立、数据传送、连接释放。

1)TCP连接的建立:

采用客户服务器方式C/S:

  • 客户机:主动发起连接建立的应用进程;
  • 服务器:被动等待连接建立的应用进程。

2)需要解决问题:

  • 要使每一方都能确知对方的存在;
  • 要允许双方协商一些参数;
  • 能够对运输实体资源进行分配。

(1)连接建立(三次握手)

 

 1)客户端发送连接请求报文段;

无应用层数据;连接请求报文不携带数据,但要消耗一个序号;

SYN=1

seq(序号)=x(随机)

2)服务器为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接;

无应用层数据;确认请求报文不携带数据,但要消耗一个序号;

SYN=1

ACK=1

seq=y(随机)

ack(确认号)=x+1

3)客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据;

SYN=0

ACK=1

seq=x+1

ack=y+1

(2)SYN洪泛攻击

发生在OSI第四层,利用TCP协议的三次握手;

攻击者发送TCPSYN,当服务器返回ACK后,该攻击者不对其进行确认,那么这个TCP连接就处于挂起状态(半连接状态)。攻击者发送非常大量的这种TCP连接,在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存。

解决方法:设置SYNCookie。

(3)数据传送

(4)连接释放(四次挥手)

 

 1)客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接;

FIN=1

seq=u

2)服务器端会回送一个确认报文段,客户到服务器这个方向的连接就释放了(半关闭状态);

ACK=1

seq=v

ack=u+1

3)服务端发完数据,就发出连接释放报文段,主动关闭TCP连接;

FIN=1

ACK=1

seq=w:取决于第三个阶段,服务器端发送的数据量的多少

ack=u+1

4)客户端回复一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭;

ACK=1

seq=u+1

ack=w+1

全过程11种状态

状态

说明

LISTEN

正在等待一个来自任何远程TCP和端口的连接请求

SYN-SENT

在已经发出一个连接请求后正在等待一个匹配的确认连接请求

SYN-RECEIVE

在已经收到并发出了一个连接请求后等待一个证实连接请求的确认

ESTABLISHED

一个打开的连接。通过此连接接收到的数据能够被传递到用户。该状态是此连接的数据传输阶段的正常状态

FIN-WAIT1

正在等待一个针对先前发送的连接终止请求的确

FIN-WAIT2

正在等待一个来自远程TCP的连接终止请求

CLOSE-WAIT

正在等待一个来自本地用户的连接终止请求

CLOSING

正在等待一个来自远程TCP的连接终止请求的确认

LAST-ACK

正在等待一个先前发往远程TCP的连接终止请求的确认(包括对其连接终止请求的确认)

TIME-WAIT

等足够的时间以确保远程TCP接收到了其连接终止请求的确认

CLOSED

根本不存在连接的状态

(4)TCP可靠传输

 

1)可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的;

2)机制:校验、序号、确认、重传

校验:与UDP校验一样,增加伪IP报文首部

序号:一个字节占一个序号;序号字段:一个报文段的第一个字节的序号;序号字段能保证数据有序提交给应用层。

确认:

确认号字段是期望收到对方的下一个报文段的数据的第一个字节的序号;

TCP默认使用累计确认:只确认数据流中至第一个丢失字节为止的字节;

捎带确认:在传送的数据中捎带确认信息;

 

  

 

 重传:

超时重传:只要计时器设置的重传时间到期还没有收到确认,就要重传这一报文段;

动态改变重传时间:

RTT:往返时间(Round-TripTime,RTT):一个报文发出的时间和收到相应确认的时间之差

RTTs:当第一次测量RTT样本时,RTTs的值为所测量到的RTT样本的值,以后的每一次采用以下公式:

新的RTTs=(1-α)*(旧的RTTs)+α*(新的RTT样本),其中0≤α<1;

若α很接近0,表示新的RTTs的值和旧的RTTs的值相比变化不大,即受新的RTT样本影响不大(RTT值更新较慢);

若α很接近1,表示新的RTTs的值受新的RTT样本影响较大(RTT值更新较快);

[RFC2988]推荐的α值为0.125。

RTTD:RTTD是RTT的偏差的加权平均值,它与RTTs和新的RTT样本之差有关;

当第一次测量时,RTTD取RTT样本值的一半,以后的每一次采用以下公式:

新的RTTD=(1-β)*(旧的RTTD)+β*|RTTs-新的RTT样本|

β是个小于1的系数,推荐值是0.25。

RTO:超时计时器设置的超时重传时间RTO(RetransmissionTime-Out),使用以下公式计算:

RTO=RTTs+4*RTTD。

冗余ACK(冗余确认):

每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待到达的序号;

当发送方接收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。

(5)TCP流量控制

流量控制:让发送方慢点,要让接收方来得及接收;

流量控制是一种速度匹配服务(匹配发送方的发送速率和接收方的接收速率);防止丢包严重;

1)滑动窗口机制

TCP使用滑动窗口机制实现流量控制;

 

 窗口允许发送方在收到ACK之前连续发送多个分组,窗口的大小就是指无需等待确认应答而可以继续发送数据的最大值。窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过TCP报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为{31,34,35},其中{31}按序到达,而{34,35}就不是,因此只对字节31进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。

在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd;

接收方设置确认报文段的窗口字段来将rwnd通知给对方;

发送方的发送窗口=Min{接收窗口rwnd,拥塞窗口cwnd};

接收窗口:

接收方根据接收缓存设置的值,并告知给发送方,反映接收方容量;

由接收方根据其放在TCP报文的首部的窗口字段通知发送方。

拥塞窗口:

发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量;

只要网络没有出现拥塞,拥塞窗口就增大一些,以便发送更多分组出去;但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络中的分组数。

发送窗口大小可以动态变化:

A向B发送数据,连接建立时,B告诉A:“我的rwnd=400(字节)”,设每一个报文段100B,报文段序号初始值为1

 

 避免死锁:

TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器;

若持续计时器设置的时间到期,就发送一个零窗口探测报文段。接收方收到探测报文段时给出现在的窗口值;

若窗口仍然是0,那么发送方就重新设置持续计时器。

(6)TCP拥塞控制

出现拥塞的条件:

对资源需求的总和>可用资源;

网络中有许多资源同时呈现供应不足->网络性能变坏->网络吞吐量将随输入负荷增大而下降。

拥塞控制:

防止过多的数据注入到网络中(全局性);

四种算法:慢开始、拥塞避免、快重传、快恢复。

1)慢开始和拥塞避免

假定:

数据单方向传输,而另一个方向只传送确认

接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞控制

发送窗口=Min{接收窗口rwnd,拥塞窗口cwnd}

 

 传输轮次:

发送一批报文段并收到它们确认的时间;

即一个往返时延RTT;

开始发送一批拥塞窗口内的报文段到开始发送下一批拥塞窗口内的报文段的时间。

2)快重传和快恢复

 

 3)其他

(1)传输层和数据链路层的流量控制的区别

传输层定义了端到端用户之间的流量控制,数据链路层定义了两个中间的相邻结点的流量控制。另外,数据链路层的滑动窗口协议大小不能动态变化,传输层则可以动态变化

(2)拥塞控制和流量控制的区别

拥塞控制是为了让网络能够承受现有的网络负荷,它是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收

 

 总结:一般需要保证数据可靠时,都会使用tcp协议:http协议进行网站的访问时,使用的就是tcp。

posted @ 2020-12-02 10:43  哈哈哈嘿呀  阅读(1176)  评论(0)    收藏  举报