运输层
运输层概述
计算机中物理层、数据链路层、网络层共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信。
如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务
,运输层协议又称为端到端协议
根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP
运输层端口号、复用与分用的概念
运行在计算机上的进程使用进程标识符PID来标志,但是不同的操作系统(windows,Linux,Mac OS)又使用不同格式的进程标识符,
因此就需要使用统一的方法对TCP/IP体系的应用进程进行标识
TCP/IP体系的运输层使用端口号
来区分应用层的不同应用进程(取值范围0~65535)
- 熟知端口号: 0~1023(FTP使用21/20,HTTP使用80,DNS使用53)
- 登记端口号:1024~49151,为没用熟知端口号的应用程序使用,这类必须IANA按照规定手续等级
- 短暂端口号:49152~65535,留给客户进程选择暂时使用
端口号只具有本地意义,即只是为了标识本计算机应用层中的各进程,在因特网中,不同计算机中的相同端口号是没用联系的
运输层端口号、复用与分用的概念
TCP/IP体系的应用层常用协议所使用的运输层熟知端口号
-
UDP
- RIP------------------520
- DNS------------------53
- TFTP------------------68
- SNMP------------------161
- DHCp------------------ 67/68
-
TCP
- SMTP------------------25
- FTP------------------21/20
- BGP------------------179
- HTTP------------------80
- HTTPS------------------443
不管在运输层使用UDP还是TCP协议,在网络层都需要使用IP协议,IP数据报首部中协议字段的值,表明了IP数据报数据载荷部分封装的是何种协议数据单元
UDP和TCP对比(运输层)
区别一:
- UDP是面向应用报文的
(即对应用层给的应用层报文不处理,只是套一层UDP头,就发往网络层) - TCP是面向字节流的
区别二:
- 使用UDP协议的运输层也是向上提供无连接不可靠的传输服务(IP电话、视频会议)
- UDP接收方若发现数据报误码,仅仅是丢弃该数据包;
- 数据报被因特网中的某个路由器丢弃了,发送方不做任何处理
- 使用TCP协议的运输层是向上提供面向连接可靠的传输服务(文件传输)
- TCP协议不会出现传输差错(误码、丢失、乱序、重复)
TCP的流量控制
一般来说,我们总是希望数据传输得更快一些,但是如果发送方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失。
所谓的流量控制,就是让发送方的发送速率不要太快,让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制
- TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小。
- TCP发送方收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文
(若零窗口探测报文在发送过程中丢失会怎么办?其实会有一个计时器来计时零窗口探针报文,若超时重发)
TCP的拥塞控制
一段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分
,网络性能就要变坏。这种情况叫做拥塞
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降
在输入负载达到某个临界点,就会让整个网络的吞吐量降为0,也叫死锁
四种拥塞控制算法
-
慢开始
从0开始,每次多加一倍的数据报的传送,直到达到门限值
-
拥塞避免
当从慢开始达到门限值后就线性增加,而不是指数级增加,当发送的报文没有得到接收方的响应
并且重传计时器超时,则
1.将慢开始的ssthresh(门限值)设置为当前拥塞时的一半,并且从1开始重新执行慢开始算法
-
快重传
- 快恢复
发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段,于是不启动慢开始算法
,而执行快恢复算法
发送方将慢开始门限值和拥塞窗口cwnd值调整为当前窗口的一半;开始执行拥塞避免算法
也有些快恢复将拥塞窗口的值设置为 门限值+3
影响TCP发送窗口的有两个因素,接收方的接收窗口以及拥塞窗口,共同决定发送窗口的大小
TCP超时重传时间的选择
TCP可靠传输的实现
TCP基于以字节为单位的滑动窗口来实现可靠传输
虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的发送窗口并不总是和接收方的接收窗口一样大
- 网络传送窗口值需要经历一定的时间滞后,并且这个时间是不确定的
- 发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口大小
TCP的连接建立
TCP的三次握手,步骤如下:
1.客户端发送一个请求,SYN=1, seq=x;其中SYN=1代表着这是一个TCP连接请求报文段,seq=x是告诉目标服务器自己的序列号;
2.服务器收到后,如果同意建立连接则向客户进程发送TCP连接请求确认报文段,其中有SYN=1,ACK=1,seq=y,ack=x+1,SYN是表明这是一个TCP请求,ACK是表明确认,并且告诉客户端自己的seq序列号,ack是表明服务端收到了客户端之前发的请求,拿到了客户发的seq并且+1当成ack发给客户端,客户看到是自己的seq+1就知道是目标服务器的响应了