运输层]1
Posted zy691357966
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运输层]1相关的知识,希望对你有一定的参考价值。
[A Top-Down Approach][第三章 运输层]
标签(空格分隔): 未分类
我们在本章采用的教学方法是:交替的讨论运输层的原理和这些原理在现有的协议是如何实现的.
TCP
和UDP
运输协议
从讨论运输层和网络层的关系开始
- 运输层第一个功能:网络层的两个端系统之间的交付服务扩展运行到两个不同端系统上的应用层进程之间的交付服务.
UDP
会阐述.
回到原理上,面对计算机网络中最为基础性的问题之一
- 两个实体才能在一种会丢失或损坏数据的媒体上可靠的通信.
- 通过复杂性不断增加的情况,逐步建立起一套协议来解决这些问题.
- 我们将说明如何在
TCP
下体现.
讨论第二个基础问题.
- 控制运输层实体的速率以避免网络中的拥塞,或从拥塞中恢复过来.
- 考虑拥塞的原因和后果,和常用的拥塞控制技术.
- 研究
TCP
的拥塞控制技术.
3.1 概述和运输层服务
逻辑通信(logic communication)
:运输层协议为运行在不同主机上的应用进程提供了逻辑通信
.
- 从应用程序角度: 通过逻辑通信,运行不同进程的主机好像直接相连一样.
3.1.1 运输层和网络层的关系
运输层和网络层具有描述上细微的差别
- 网络层:提供主机之间的逻辑通信
- 运输层:提供不同主机的进程之间的逻辑通信.
运输层仅仅将报文从端系统移到网络边缘.
3.1.2 因特网运输层概述
在对UDP(用户数据报协议)
和TCP(传输控制协议)
,简要介绍前,简单介绍一下因特网的网络层
- 网络层协议有一个名字叫
IP
,即网际协议.
IP
为主机之间提供了逻辑通信.IP
的服务模型为尽力而为交付服务(best-effort delivery sevice)
- 尽最大努力,但是不进行任何确保.
- 不确保报文段的交付,不确保报文段的按序交付,不确保报文段数据的完整性.
- 所以,
IP
被称为不可靠服务(unreliable service)
.
- 每个主机有一个
IP
地址.
对IP
服务模型有了了解后,总结一下UDP
和TCP
的服务模型
多路复用:
UDP
和TCP
最基本的责任是:将两个端系统间的IP
的交互服务扩展为运行在端系统上的两个进程之间的交互服务.- 被称为
运输层的多路复用(transprot-layer multplexing)
和多路分解(demultiplexing)
. - 下一节仔细讨论.
- 被称为
完成性检查:
UDP
和TCP
还在报文段首部中包括差错检查字段而提供完成性检查
以上是运输层的两种最低限度的服务,也是UDP
仅能提供的服务.
下面讨论TCP
的几种附加服务.
- 可靠数据传输:通过使用流量控制,序号,确认和定时器,
TCP
确保正确的,按序的将数据发送出去.
TCP
将不可靠IP服务转换成一种进程间的可靠数据传输服务
拥塞控制: 提供给整个因特网的服务,带来通用好处的服务.
3.4~3.7
详细讨论
3.2 多路分解与多路复用
基本概念:网络层提供的主机到主机的交付服务延伸到位运行在主机的应用程序提供进程到进程的交互服务.
多路分解(demultiplexing)
: 将运输层报文段中的数据交付到正确的套接字的工作称为多路分解.多路复用(multiplexing)
:在源主机从不同套接字收集数据块,并为每个数据块封装上首部信息(在以后用于分解)从而生成报文段,将报文段传递到网络层,叫做多路复用.
- 端口号是一个
16
比特的数,大小为0 ~ 65535
0 ~ 1023
范围的端口号被称为周知端口号(well-know port)
- HTTP,FTP等.
1. 无连接的多路复用与多路分解.
clientSocket = socket(socket.AF_INET,socket.SOCK_DGRAM)
- 这样创建时,运输层自动为该套接字分配一个端口号
- 范围是
1024~65535
.没有被其他UDP
所占用的端口号.
- 范围是
clientSocket.bind(('',19157))
通过套接字
bind()
方法为该套接字关联一个特定的端口号.一个
UDP
套接字由一个二元组表示,(IP,端口号)
- 与
TCP
不同
- 与
不同源地址到底同一个目的地址,会送到相同的套接字
- 与
TCP
不同
- 与
2. 面向连接的多路复用和多路分解
更为仔细的研究TCP
套接字和TCP
连接.
TCP
套接字由一个四元组构成:(源IP,源端口,目的IP,目的端口)
- 不同源地址到达同一个目的地点是,会送到不同套接字
- 这就是连接的本质
3. Web 服务器与 TCP
- 套接字一般与线程一一对应.
- 可持续连接,和不可持续连接.
- 套接字的频繁创建严重的影响一个繁忙的
Web
服务器的性能. - 可以通过套接字池等操作系统技巧来缓解.
- 套接字的频繁创建严重的影响一个繁忙的
3.3 无连接运输: UDP
UDP协议相对于网络层增加的功能.
- 多路分解/复用
- 少量的差错检查
什么情况更适用UDP
- 关于何时,发送什么数据的应用层控制更为精细.
TCP
具有拥塞控制,使得延迟变长.
- 无需连接建立.
- 少了建立连接的时延.
- 无连接状态
TCP
需要在端系统维护连接状态.
- 包括接受和发送缓存,拥塞控制参数以及序号与确认号的参数
- 分组首部开销小.
TCP
报文段有20字节的开销UDP
仅有8字节
3.3.1 UDP报文字段
- 长度字段:长度字段指明了包括首部在内的
UDP
报文段长度. - 检验和 :在下文介绍
3.3.2 UDP检验和
检验和
: 检验和用于确定当UDP
报文段从源到达目的地移动时,其中比特是否发生了改变.发送方对报文段所有16比特的字的和进行反码运算
接收方 对报文段所有16比特的字的和(包括检验和)想加,结果要是
FFFF
表示可能正确.A+[A]反=FFFF
为什么UDP提供检验和
端到端原则:网络高层次的功能应尽可能的实现在网络边缘(终端设备),网络核心框架只提供最基本的标准的服务。
优点:
1、降低网络核心的复杂度和实现成本,易于维护和升级;
2、在不修改网络架构的基础上实现应用的扩张;
3、网络核心架构简单,更可靠,且扩展性也好;
4、简化了终端用户和网络之间的接口,终端用户不依赖与网络的内部状态;
UDP
对差错恢复无能为力.
3.4 可靠数据传输原理
如图3-8
(a)
为上层实体提供的服务抽象是:数据可以通过一条可靠信道进行传输.- 借助于可靠的信道,传输数据就不会受到损坏或丢失.
- 而且所有数据都是按照其顺序进行交互.
- 这恰好是
TCP
向调用它的应用提供的服务模型 可靠数据传输协议(reliable data transfer protocol)
的责任.
(b)
为服务的具体实现- 假设:分组以发送次序进行交付,可能会丢失,底层信道不会对分组重新排序.
rdt_send()
: 可以调用数据传输协议的发送方.
- 将要发送的数据交付给接收方的较高层
rdt_rcv()
: 分组到达信道的接收端时,调用rdt_rcv()
.deliver_data()
:当rdt
协议向较高层交付时,使用deliver_data
来完成.
在本节,我们仅考虑单项数据传输(unidirectional data transfer)
3.4.1 构造可靠数据传输协议
我们一步步研究一系列协议,一个比一个复杂,最后得到一个无错的,可靠的数据传输协议.
1. 经完全可靠信道的可靠传输协议: rdt 1.0
考虑最简单的情况,即底层信道完全可靠.称该协议为rdt 1.0
有限状态机(Finite-State Machine,FSM)
- 引起变迁的事件显示在表示变迁的横线上方,
- 事件发生所采取的动作显示在横线下方.
- 没如果没有事件,或者没有动作,就用
∧
表示
- 没如果没有事件,或者没有动作,就用
FSM
的初始状态用虚线表示.rdt
的发送端.rdt_send(data)
事件接受来自较高层的数据.
- 产生一个包含该数据的分组
mark_pkt(data)
- 分组发送到信道中
udt_send(packet)
.
- 产生一个包含该数据的分组
- 由较高层调用
rdt
的接收端rdt_rcv(packet)
事件从底层信道接受一个分组.
- 从该分组取出数据
extract(packet,data)
- 数据传输给较高层
deliver_data(data)
- 从该分组取出数据
- 由较低层调用
有了完全可靠的信道,接收方不需要提供任何反馈信息给发送方.
2. 经具有比特差错信道的可靠数据传输: rdt 2.0
假定:所有分组的发送(虽然有些比特可能受损)将其发送的顺序接收.
肯定确认(postive acknowledgment)
与否定确认(negative acknowledgment)
- 这些控制报文使得接收方可以让发送方知道哪些内容被正确接收,
哪些有误需要重传.
- 这些控制报文使得接收方可以让发送方知道哪些内容被正确接收,
自动重传请求(Autumatic Repeat reQuest,ARQ)协议
:基于重传机制的可靠数据传输协议.ARQ
协议还需要另外三种协议来处理比特差错情况.
- 差错检测: 一种检验机制是否发生了出错.
- 接收方反馈: 提供
ACK(肯定确认)
或者NAK(否定确认)
- 重传:接收到错误分组后,发送方重传该分组.
rdt 2.0
也被称为停等协议rdt 2.0
看起来可运行的,但有个致命错误:无法确认NAK
或者ACK
是否受损.有三种解决方法.
- 一:发送一个类似
NAK
,AFK
的信息要受损的NAK
,AFK
重传.
- 但是这个信息也可能受损
- 二:增加足够的检验和比特,使得发送方不仅可以检查差错,还能恢复差错.
- 对于只产生差错,不丢失分组的信道,这样可以直接解决问题.
- 三:当收到含糊不清的
NAK
,ACK
时直接重传数据.
冗余分组(duplicate packet)
,接收方不知道上次发送的ACK
和NAK
是否被接收到,所以不知道接收的分组是否是新的.
- 一:发送一个类似
解决如何判断接收的分组是最新的简单的方法:对数据分组进行编号
- 对于停等协议只需要1比特的序号就能足够判断.
- 判断序号是否跟上一个相同就行
(0->1->1(重传)->0->1)
- 判断序号是否跟上一个相同就行
- 对于停等协议只需要1比特的序号就能足够判断.
rdt 2.1
rdt 2.2
将 NAK的冗余消除了.
- 通过返回
AFK + 序号
(上次接收方成功接收到的序号)来达到同样的目的..
- 通过返回
3. 具有比特差错的丢包信道的可靠数据传输: rdt 3.0
假定:信道除了比特受损,还会丢包
协议关注两个问题.
- 怎么检测丢包?
- 下面我们讨论的关键
- 发生丢包后该做些什么?
- 通过
rdt 2.0
我们可以给出发生丢包后的措施,回传ACK,然后重传.
- 通过
- 怎么检测丢包?
为解决第一个问题,我们需要加入新的机制:定时.
- 可能有很多种解决方法,这个方法,我们要发送方负责检测和恢复丢包工作.
- 通过发送方在一定时间内收不到接收方的响应,那么当做已经丢失.重传分组.
- 发送方需要明智的选择一个时间值
- 可能会有冗余数据分组,但是
rdt 2.2
已经很好的处理了.
- 需要一个
倒计数定时器(countdown timer)
- 启动定时器
- 响应定时器中断
- 终止定时器.
- 通过发送方在一定时间内收不到接收方的响应,那么当做已经丢失.重传分组.
rdt 3.0
有时也叫做比特交替协议(alternating-bit protocol)
.归纳一下可靠数据传输协议的要点.
检验和
,序号
,定时器
,肯定确认
3.4.2 流水线可靠数据传输协议
rdt 3.0
性能问题很严重,其核心问题是它是一个停等协议从图上就能看出,停等协议对网路资源的利用效率之低令人发指
流水线技术
流水线(pipelining)
:再等待确认时,多发送几组报文,效率也提高几倍,像填充到一条流水线,所以叫流水线可靠传输.- 必须增加序号范围.
- 每个输送中的分组必须有一个唯一的序号.
- 协议的发送方和接收方必须缓存多个分组
- 所需序号范围和对缓冲的要求取决于如何处理丢失,损坏,延时过大的分组.两种基本方法
回退 N 步(Go-Back-N,GBN)
选择重传(Selective Repeat,SR)
- 必须增加序号范围.
3.4.3 回退 N 步
3.4.4 选择重传
3.5 面向连接的运输: TCP
TCP
是运输层面向连接的可靠的运输协议以来上述的许多基本原理,包括
差别检测
,重传
,累积确认
,定时器
,以及用于序号和确认号的首部字段TCP
被定义在RFC 793
,RFC 1122
,RFC 1323
,RFC 2018
以及RFC 2581
3.5.1 TCP连接
TCP
是被称为面向连接的(connection-oriented)
,即在传输之前先进行握手.
- 连接的双方都将初始化与
TCP
连接相关的许多TCP
状态变量
这种TCP
“连接”不是一条像电路交换网络中的端到端的TDM
或FDM
电路,也不是一条虚电路.
TCP
协议只在端系统运行,不在中间的网络元素(路由器和交换机)中运行.
TCP
连接提供的是全双工服务(full-duplex service)
,点对点(p2p)
- 三次握手 建立连接
开始传输,如下图.
发送缓存
:数据引导进连接的发送缓存,TCP
不时的从发送缓存取出数据.
TCP
规范没有规定何时从发送缓存发送数据,只是描述为
TCP应该在他方便的时候以报文段的形式发送数据.
最大报文段长度(Maximum Segment Size,MSS)
:TCP 可以从缓存取出并放入报文段中的数据数量.MSS
通常由本地发送主机的最大链路层帧长度来设置
- 即
最大传输单元(Maximum Transmission Unit,MTU)
来设置.
- 即
- 设置
MSS
通常是报文段+TCP/IP首部字段
适合MTU
TCP/IP
首部字段通常是40byte
,MTU
通常是1500
比特,所以MSS
就通常为1460比特
- 现在还有基于
路径MTU
来设置MSS
.
路径MTU
:源到目的链路上发送的最大链路层帧
TCP
为每块数据配上一个TCP首部,形成多个TCP segment
,这些segment
下传给网络层,封装在IP
数据报,然后发送给网络,然后被另一端的TCP
接收.
3.5.2 TCP报文段结构
序号字段(seq)
和确认号字段(ack)
: 均为32
位,被TCP
接收方和发送方用于实现可靠数据传输服务.接受窗口字段
:16
位,用于流量控制,指示接受方愿意接受的字节数目.首部长度字段
:4
比特,指示了以2字节/32比特
为单位的TCP
首部长度.- 由于
选项字段
所以TCP首部字段
是可变的. - 若选项字段位空,那么首部长度为典型的
20
字节.
- 由于
标志字段
:6
比特ACK
: 指示确认字段的值是有效的.RST
,SYN
,FIN
: 用于连接的建立和删除PSH
:被设置的时候,指示接收方应立即把数据交给上层.URG
:指示报文段存在着被发送端上层置位紧急的数据.
- 紧急数据的最后一个字节由16比特的
紧急数据指针字段
指出. - 当紧急数据存在,并给出指针时,
TCP
必须通知接受端的上层. - 在实践中,
PSH
,URG
和紧急数据指针并没有使用过.
- 紧急数据的最后一个字节由16比特的
1. 序号和确认号
TCP
报文段首部中两个最重要的字段是序号字段和确认号字段
序号
TCP
把数据看做一个无结构的,有序的字节流.- 我们从
TCP
对序号的使用上可以看出这一点,是建立在字节流,而不是报文段.
- 我们从
一个报文段的序列号
:应该是该报文段首字节的字节流编号- 第一个报文段序号:0
- 第二个报文段序号:1000
- 以此类推
确认号
- 主机
A
填入报文段的确认号是主机A
期望从主机B
收到的下一个字节的序号.
- 比如接收到了
0~535
,那么确认好将为536
- 即使接受到
0~535
和900~100
,而没收到536~899
,确认号依旧是536
- 此处涉及一个
失序
的问题,TCP
协议没有规定,交由编程人员处理.有两种.
- 接收方立即丢弃失序报文段.
- 接收方保留报文段并等待确实的字节以填补,实践中采用的犯法.
- 此处涉及一个
累计确认
:TCP
只确认该流中第一个丢失字节位止的字符,所以TCP
也被称为累计确认.
- 比如接收到了
2. Telnet: 序号和确认号的一个学习案例
Telnet
由 RFC 854
定义,现在是一个用于远程登录的流行用户协议.
- 运行在
TCP
之上. - 讨论
Telnet
是因为方便学习序号和确认号,现在更广泛应用的是SSH
- 主机A和主机B的初始字段位
42
和79
Seq
:序号ACK
:确认号
3.5.3 往返时间的估计和超时
- 暂时不考虑
3.5.4 可靠数据传输
3.5.5 流量控制
3.5.6 TCP 连接管理
在这一章,更为仔细的观察如何建立和拆除一条TCP
连接
- 网络攻击中的
SYN泛洪攻击
与之息息相关
建立连接
客户端的
TCP
向服务端的TCP
发送一个特殊的TCP
报文段- 不含应用层数据
- 标志位
SYN
被置 1 ,所以又叫SYN报文段
- 随机选择一个
初始序号(client_isn)
,将该序号放置在报文段的序号字段.
SYN报文段到达服务器主机.
- 服务器会为该
TCP
连接分配TCP
缓存和变量 - 并向客户端发送允许连接的报文段.
SYN
置 1- 确认号字段被置位
client_isn+1
- 服务器随机选择自己的初始序号
server_isn
,并置序号字段 - 这个报文段有时也叫
SYNACK 报文段
- 服务器会为该
SYNACK 报文段到达客户端主机
- 客户端也分配缓存和变量.
- 向服务器发送报文段,对服务器进行确认.
server_isn+1
作为确认码client_isn+1
作为序号SYN
置0- 可以在报文段负载客户到服务器的数据了.
断开连接
客户端TCP连接生命周期
服务端TCP连接生命周期
SYN洪泛攻击与cookie
nmap的原理
原理:一台主机接收了具有目的端口号
80
的TCP SYN
分组,如果80
端口没有打开,返回一个将RST
标志位置1的特殊报文.
nmap 是一个功能强大的工具,该工具不仅能 侦查 打开的
TCP
端口,也能侦查打开的UDP
端口,还能侦查防火墙及其配置,甚至应用程序版本和操作系统
3.6 拥塞控制原理
3.7 TCP拥塞控制
3.8 小结
以上是关于运输层]1的主要内容,如果未能解决你的问题,请参考以下文章