运输层
前言 传输层和应用层的关系
做下面的比喻:
应用层报文——发信信封上的字符
进程——收信方和发信方
主机——两个家庭
传输层协议——两个家庭专门负责收发信的人
网络成协议——邮政服务(逻辑通信提供者)
一、传输层的功能
传输层为运行在不同主机的应用提供逻辑通信。对网络层的服务进行增强(如数据排序,加密等,有些服务是不可增强的,如带宽、延迟)
发送方:将应用层的报文分成报文段,然后传递给网络层。
接受方:将报文段重组为报文,然后传递给应用层。
二、常见的应用使用的端口号总结
应用 | 端口号 |
---|---|
HTTP | 80/8080/3128/8081/9098 |
FTP | 21/22 |
Telent(远程登录) | 23 |
HTTPS | 443(TCP) 443(UDP) |
SMTP | 25(TCP) |
POP3 | 110(TCP) |
SSH(安全登录) | 22(TCP) |
SOCKS(代理服务器) | 1080(TCP) |
三、传输层协议
3.1 TCP协议
3.1.1 TCP简介
TCP全称:传输控制协议-Transmission Control Protocol,是一种面向连接的协议,它是一个面向连接的通信协议。TCP协议是基于IP协议的。
面向连接:两个应用程序相互发数据之前必须先握手。
提供可靠的数据传输、拥塞控制、流量控制。
TCP提供全双工服务(Full-duplex service) ,当两个进程A和B建立起TCP连接后,那么应用层数据在从A流向B的同时也从B流向A。
点对点:TCP是单个发送方和单个接收方的协议。多播(即一次发送多个点接收)是无法实现的。
①最大报文段长度(Maximum Segment Size,MSS):该术语很容易被混淆,它其实指的是报文段里应用数据的最大长度,而不是包括TCP首部的TCP报文段的最大长度。
②最大传输单元(Maximun Transmission Unit,MTU):指的是最大链路层帧长度,即应用数据+TCP首部+IP首部。
TCP连接的组成包括:两台主机上的缓存、变量和与进程相连的套接字而两台主机之间的网络元素(路由器、交换机和中继器)没有为该连接分配任何变量。
3.1.2 TCP的报文结构
结构名称 | 大小 | 作用 |
---|---|---|
源端口号 | 16比特 | 存储发送方端口号 |
目标端口号 | 16比特 | 存储接收方端口号 |
序号Seq | 32比特 | 报文段的首字节在字节流的编号 |
确认号Ack | 32比特 | 期望从另一方收到的下一个字节的序号 |
接收窗口 | 16比特 | 愿意接收的字节数量 |
校验和 | 16比特 | 校验传输的数据的准确性 |
应用层数据 | 长度不确定 | 传输的数据 |
源端口号和目标端口号
被用于多路复用来自上层应用的数据/多路分解送到上层应用
32比特的序号字段和32比特的确认字段
这些字段被TCP发送方和接收方用来实现可靠数据传输服务。
序号是可靠传输的关键因素。TCP将要传输的每个字节都进行了编号,序号是本报文段发送的数据组的第一个字节的编号,序号可以保证传输信息的有效性。比如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为401。
每一个ACK对应这一个确认号,它指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
16比特接收窗口字段
该字段用于指示接收方愿意接收的字节数量,用于流量控制
4比特的首部长度字段
指示以32比特的字为单位的TCP首部长度,表示该TCP头部有多少个32位bit(有多少个4字节),所以TCP头部大长度是15 * 4 = 60。根据该部分可以将TCP报头和有效载荷分离。TCP报文默认大小为20个字节。
可选与变长的选项字段
该字段用于发送方与接收方协调最大报文长度(MSS)时,或在高速网络环境下用作窗口调节因子时使用。
6比特的标志字段
ACK(确认反馈),RST、SYN、FIN(用于连接的建立和拆除),【PSH(指示接收方应立即将数据交给上层),URG(报文里存在着被发送端上层设为紧急的数据,紧急数据的最后一个字节由一个16比特的紧急数据指针指出)】在实践中,PSH和URG并没有使用。
URG:它为了标志紧急指针是否有效。
ACK:标识确认号是否有效。
PSH:提示接收端应用程序立即将接收缓冲区的数据拿走。
RST:它是为了处理异常连接的, 告诉连接不一致的一方,我们的连接还没有建立好, 要求对方重新建立连接。我们把携带RST标识的称为复位报文段。
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段。
FIN:通知对方, 本端要关闭连接了, 我们称携带FIN标识的为结束报文段。
16位的紧急指针
按序到达是TCP协议保证可靠性的一种机制,但是也存在一些报文想优先被处理,这时就可以设置紧急指针,指向该报文即可,同时将紧急指针有效位置位1。
16位校验和
发送端填充,CRC校验。如果接收端校验不通过, 则认为数据有问题(此处的检验和不光包含TCP首部也包含TCP数据部分)。
Details
3.1.3 TCP特性解读
1.可靠数据传输
TCP在IP提供的不可靠服务的基础上建立了rdt。提供了累计确认和超时重传机制。允许乱序接收。
2.流量控制
缓冲区:TCP往里面写数据,app从里面读数据。接收方控制发送方,不让发送方发送的太多、太快,以致于让接收方的缓冲区溢出。接收方在其向发送方的TCP报文段头部的rwnd字段“通告”其空闲缓存区大小。发送方根据rwnd字段控制发送数据的大小,保证接收方不会被淹没。
3.连接控制
三次握手建立连接。详见下一篇文章。
3.2 UDP协议
3.2.1 UDP协议简介
全称:用户数据报协议-User Datagram Protocol,简称UDP,是一种无连接的数据传输协议。
无连接:UDP发送端和接收端没有握手;每个UDP报文段都被独立的处理。
优点:传输速度快(无需握手、无拥塞和流量控制)、开销小(报文段的头部很小)
缺点:可能丢失、可能乱序
应用:流媒体(要求速率,对丢失不敏感)、DNS
3.2.2 UDP报文格式
UDP首部由8个字节构成,每个字段都是两个字节
1、源端口:源端口号,需要对方回信时选用,不需要时置0;
2、目标端口:目的端口号,在终点交付报文时需要用到;
3、头部长度:UDP的数据报长度(包含首部和数据),最小值为8字节(只有首部);
4、校验和:检测UDP数据在传输中是否出错,有错则丢弃。
该字段可选,当源主机不想计算校验和,则置0,当传输层从IP层收到UDP数据报时,根据首部中的目标端口,把UDP数据通过相应的端口交给应用进程。若接收方UDP发现收到的报文中目的端口号不正确,就丢弃该报文,由ICMP发送“端口不可达”报错给发送方。
在计算校验和时,在UDP数据报前加12字节的伪首部,并不是UDP真正的首部。只是在计算校验和时临时添加在UDP数据报的前面得到的临时数据报,后校验临时数据报。伪首部既不向下传送,也不向上递交,仅仅为了计算校验和。这样,即检查了UDP的数据报,又对IP数据报源IP地址和目标地址进行了校验。
Details
四、拥塞控制
拥塞:大多数数据需要传输,超过了网络的处理能力。
拥塞的表现:分组丢失(路由器缓冲区溢出)、分组延迟(在路由器中的排队延迟)
4.1 TCP拥塞控制
路由器不向主机发送拥塞相关的反馈信息(路由器的负担较轻、符合网络核心简单的TCP/IP架构原则)
端系统根据自身得到的消息,判断是否发生拥塞,从而采取动作
拥塞监测的方式
某个段超时了(丢失事件):拥塞
超时时间到,某个段的确认没有来。
原因1:网络拥塞(某个路由器缓冲区没空间了,被丢弃)大概率
原因2:出错被丢弃了(各级错误,没有通过校验,被丢弃)小概率
一旦超时,就认为发生了拥塞,有一定误判,但是总体控制方向是对的
五、TCP和UDP的异同
相同点:TCP和UDP都是在网络层,都是传输层协议,都能都是保护网络层的传输,双方的通信都需要开放端口。
不同点: \ | TCP | UDP :---: | :---: | :---: 1 | TCP的传输是可靠传输。 | UDP的传输是不可靠传输。 2 | TCP是基于连接的协议,在正式收发数据前,必须和对方建立可靠的连接。 | UDP是和TCP相对应的协议,它是面向非连接的协议,它不与对方建立连接,而是直接把数据包发送出去 3 | TCP是一种可靠的通信服务,负载相对而言比较大,TCP采用套接字(socket)或者端口(port)来建立通信。 | UDP是一种不可靠的网络服务,负载比较小。 4 | TCP和UDP结构不同,TCP包括序号、确认信号、数据偏移、控制标志(通常说的URG、ACK、PSH、RST、SYN、FIN)、窗口、校验和、紧急指针、选项等信息。 | UDP包含长度和校验和信息。 5 | TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 | UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。 6 | TCP在发送数据包前在通信双方有一个三次握手机制,确保双方准备好,在传输数据包期间,TCP会根据链路中数据流量的大小来调节传送的速率,传输时如果发现有丢包,会有严格的重传机制,故而传输速度很慢。 | UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 7 | TCP支持全双工和并发的TCP连接,提供确认、重传与拥塞控制。 | UDP适用于哪些系统对性能的要求高于数据完整性的要求,需要“简短快捷”的数据交换、需要多播和广播的应用环境。
六、多路复用和分用
由于一个主机上有多个进程,因此要进行多路复用和分用。如果某层的一个协议对应上层的多个协议/实体,就需要进行服用/分用。
传输层根据头部信息将收到的报文交给正确的Socket(即不同的进程)。
从多个Socket接收数据,为每个数据封装头部信息,生成报文,交给网络层。
分用:
主机接收到IP数据报(datagram)
每个数据报携带源IP地址、目的IP地址
每个数据报携带一个传输层的段(Segment)
每个段携带源端口号和目的端口号
主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket
TCP做更多处理