运输层协议概述
1.进程之间的通信
(1)定义
运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层
运输层为相互通信的应用进程提供了逻辑通信
(2)特点
两个主机进行通信实际上就是两个主机中的应用进程互相通信
应用进程之间的通信又称为端到端的通信
复用和分用
(3)运输层的主要功能
运输层为应用进程之间提供端到端的逻辑通信(但网络层是为主机之间提供逻辑通信)
运输层还要对收到的报文进行差错检测。
运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP
2.TCP/IP 的运输层有两个不同的协议
(1)用户数据报协议 UDP (User Datagram Protocol)
- UDP 传送的数据单位协议是 UDP 报文或用户数据报
- UDP 面向无连接,不提供可靠交付,但在某些情况下 UDP 是一种最有效的工作方式
- UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的
(2)传输控制协议 TCP (Transmission Control Protocol)
- TCP 传送的数据单位协议是 TCP 报文段(segment)
- TCP 则提供面向连接的服务,但不提供广播或多播服务
3.运输层的端口
(1)定义
运行在计算机中的进程是用进程标识符来标志的
为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志
端口用一个 16 位端口号进行标志。
端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。
(2)软件端口与硬件端口
在协议栈层间的抽象的协议端口是软件端口。
软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址路由器或交换机上的端口是硬件端口。
硬件端口是不同硬件设备进行交互的接口
(3)三类端口
熟知端口,数值一般为 0~1023。
登记端口号,数值为1024~49151
为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记,以防止重复。客户端口号或短暂端口号,数值为49152~65535
留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。
(4)常见的端口号
- FTP(文件传输协议): 21
- TELNET(远程登录协议): 23
- SMTP(简单邮件传送协议): 25
- DNS(域名解析服务:UDP): 53
- TFTP(小文件传输协议:UDP): 69
- HTTP(超文本传输协议): 80
- HTTPS(安全的超文本传输协议):443
用户数据报协议 UDP
1.UDP 概述
- UDP 只在 IP 的数据报服务之上增加了端口的功能和差错检测的功能
2.UDP 的主要特点
UDP 是无连接的,即发送数据之前不需要建立连接。
UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。
UDP 支持一对一、一对多、多对一和多对多的交互通信。
UDP 的首部开销小,只有 8 个字节
3.UDP 是面向报文的
(1)UDP 的首部格式
(2)UDP 基于端口的分用
可靠传输的工作原理
1.停止等待协议
(1)特点
在发送完一个分组后,必须暂时保留已发送的分组的副本。
分组和确认分组都必须进行编号。
超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些
(2)自动重传请求ARQ (Automatic Repeat reQuest)
(3)优缺点
优点是简单
缺点是信道利用率太低
2.连续 ARQ 协议
接收方一般采用累积确认的方式
累积确认的优点:容易实现,即使确认丢失也不必重传
累积确认的缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息
传输控制协议 TCP 概述
1.TCP 的特点
- TCP 是面向连接的运输层协议。
- 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
- TCP 提供可靠交付的服务。
- TCP 提供全双工通信。
- 面向字节流
2.TCP 的连接
- 每一条 TCP 连接有两个端点,即套接字(socket),端口号拼接到IP 地址即构成了套接字
套接字 socket = (IP地址: 端口号)
3.TCP 的可靠传输
TCP 连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。
TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。
TCP 两端的四个窗口经常处于动态变化之中。
TCP连接的往返时间 RTT 可能会变。需要使用特定的算法估算较为合理的重传时间
4.TCP 报文段的首部格式
(1)源端口和目的端口字段:各占 2 字节
端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现
(2)序号字段:占 4 字节
TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
(3)确认号字段:占 4 字节
是期望收到对方的下一个报文段的数据的第一个字节的序号
(4)数据偏移(即首部长度):占 4 位
它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远
(5)保留字段:占 6 位
保留为今后使用,但目前应置为 0
(6)标志位
紧急 URG
当 URG=1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)确认 ACK
只有当 ACK=1 时确认号字段才有效。当 ACK =0 时,确认号无效推送 PSH (PuSH)
接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付推送 PSH (PuSH)
接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付复位 RST (ReSeT)
当 RST =1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。同步 SYN
SYN = 1 表示这是一个连接请求或连接接受报文终止 FIN (FINis)
用来释放一个连接。FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
注:还有两个标志位:CWR——减小拥塞窗口和ECE——ECN显示拥塞通告:发送端在路由器开始丢包前降低发送速率
(7)窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节
(8)检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部
(9)紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
(10)选项字段 —— 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节
注:MSS (Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度。
数据字段加上 TCP 首部才等于整个的 TCP 报文段
(11)填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
TCP 可靠传输的实现
1.以字节为单位的滑动窗口
(1)A 发送了 11 个字节的数据
注:
* 根据 B 给出的窗口值,A 构造出自己的发送窗口
* TCP 标准强烈不赞成发送窗口前沿向后收缩
(2)A 收到新的确认号,发送窗口向前滑动
注:对于未按序收到的数据,B先存下,等待缺少的数据的到达
(3)A 的发送窗口内的序号都已用完,但还没有再收到确认,必须停止发送
2.缓冲区
(1)发送缓存
(2)接受缓存
(3)作用
发送缓存用来暂时存放:发送应用程序传送给发送方 TCP 准备发送的数据和 TCP 已发送出但尚未收到确认的数据。
接收缓存用来暂时存放:按序到达的但尚未被接收应用程序读取的数据和 不按序到达的数据。
(4)特点
A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。
3.超时重传时间的选择
往返时延的方差很大
加权平均往返时间
超时重传时间 RTO
修正的 Karn 算法
报文段每重传一次,就把 RTO 增加为2倍
TCP的流量控制与拥塞控制
1.利用滑动窗口实现流量控制
(1)定义
流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞
(2)持续计时器(persistence timer)
- TCP 为每一个连接设有一个持续计时器。
- 只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器。
- 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
- 若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。
- 若窗口不是零,则死锁的僵局就可以打破了
2.考虑传输效率的流量控制
TCP 缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去
由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(push)操作
发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。
3.出现资源拥塞的条件
对资源需求的总和 > 可用资源
4.拥塞控制的方法
(1)慢开始
发送方每收到一个对新报文段的确认(重传的不算在内)就使 cwnd 加 1,其实就是每轮cwnd乘2
(2)拥塞避免
把cwnd控制为按线性规律增长,
(3)快重传
发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段
(4)快恢复
当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh 减半后的数值然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
(5)结合这四种拥塞控制的方法,举个例子
小疑问
1.QQ为什么使用UDP传输消息
答:主要有以下三个原因:
因为国内的网络环境非常复杂,而且很多用户采用的方式是通过代理服务器共享一条线路上网的方式,在这些复杂的情况下,客户端之间能彼此建立起来TCP连接的概率较小,严重影响传送信息的效率。而UDP包能够穿透大部分的代理服务器,因此QQ选择了UDP作为客户之间的主要通信协议。
当时没有epoll这种可以支持成千上万tcp并发连接的技术,所以他们使用了udp,然后在udp上面封装了一下,模拟了一下tcp,解决了大并发的问题,之后因为做的很nb了,虽然epoll这种技术出现了,还是没有改回使用tcp了.现在再做类似的东西就不需要使用udp了.
QQ登陆采用TCP协议和HTTP协议,好友之间发送消息,主要采用UDP协议,内网传文件采用了P2P技术。总来的说:
- 登陆过程,客户端client 采用TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有一个TCP连接来保持在线状态。
- 和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
- 如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。
2.QQ如何用UDP实现可靠传输?
答:UDP 协议是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。但是,作为聊天软件,怎么可以采用这样的不可靠方式来传输消息呢?于是,腾讯采用了上层协议(应用层)来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到“消息发送失败”但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。
本人才疏学浅,若有错,请指出
谢谢!
参考资料:《计算机网络 第六版》-谢希仁