王道考研复习-计算机网络-传输层TCP/UDP协议(五)
传输层基本概念
- 位于第四层网络层之上
- 传输层寻址与端口通信
- 面向进程通信的,提供进程之间的逻辑通信
传输层的重要协议
- TCP段: TCP链接管理,TCP可靠传输,TCP流量控制与拥塞控制
- UDP: UDP校验
传输层提供的服务
- 概念: 从通信和信息处理的角度来看,传输层向它上面的应用层提供通信服务,完成数据派发到具体的应用层序端口,属于通信层的最上层,同时也是用户功能中的最底层
- 与传输层的差异: 传输层是为运行在不同主机上的进程提供逻辑通信,而网络层则是提供不同主机之间的逻辑通信,网络层协议并不可靠(分组丢失,混乱,重复...),传输层同样能为应用层序提供可靠的服务
- 功能:
- 传输层提供进程之间的通信,端到端的之间的通信,比如我门开开发中使用的Socket(套接字),都需要指定一个端口进行通信
- 复用和分用: 复用就是发送方不同的应用进程都能使用同一个传输层协议传送数据,分用是接受放的传输层在剥去报文首部后能把这些数据分开并交互到对应的应用。
- 传输层还需要对接受的报文进行差错校验(首部和数据部分),而传输层只检查IP数据包的的首部,不检验数据部分是否出错.
- 提供两种不通的传输协议: 面向连接的TCP和无连接的UDP
传输层的寻址与端口
- 端口能应用层序将数据通交互给传输层,以及让传输层知道应将其报文段中的数据向上通过端口交互给应用层相应的进程.
- 端口是传输层的服务访问点(TSAP): TransportLayer Service Access Point,它在传输层的作用类似IP地址在网络层的作用或MAC地址在数据链路层的作用。数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口
- 在协议栈层间的抽象的协议端口是软件端口,它与路由器或交换机上的硬件端口是完全不同的概念,硬件端口是不同硬件设备进行交互的端口,而软件端口则是应用层各种协议进程与传输层实体进行层交互的一种地址,传输层使用的是软件端口。
- 端口号: 应用层序通过端口号进行标示:(占用16bit),能够表示
65536(2^16)
个不同端口号,端口号只具有本地意义,标示本计算机应用层中的各进程. 所以在因特网上不同计算机相同端口号是没有联系的,根据端口号范围可以将端口划分为两类 服务端使用的端口号,
- 熟知应用的端口号 0~1023,IANA(互联网地址纸牌机构)把这些端口指派给了TCP/IP最重要的一些应用层序,让所有用户都知道
另一类称为登记端口号
1024~49151
,使用这类端口需要在IANA
登记,以防止重复应用程序 FTP TELENT SMTP DNS TFTP HTTP SNMP 熟知端口号 21 23 25 53 69 80 161
客户端使用的端口号:
49151 ~ 65536
,由于这类端口仅在客户端进程运行时才动态选择,因此也称为短暂的端口号(临时端口号),通信结束后通过的客户端口号就不复存在,这个端口被回收可以供其他的客户进程使用套接字:
- 在网络层中通过IP地址来标示和区分不同的主机,通过端口号来标示和区分一台主机中不同应用程序,在网络中此采用发送方和接受放的套接字(Socket)组合来识别断点,所谓的套接字实际上是一个通信端点,即
- 套接字 = (主机IP地址 + 端口号)
- 它是唯一标示网络中一台主机和主机上的一个应用的进程。
- 在网络层中通过IP地址来标示和区分不同的主机,通过端口号来标示和区分一台主机中不同应用程序,在网络中此采用发送方和接受放的套接字(Socket)组合来识别断点,所谓的套接字实际上是一个通信端点,即
无连接与面向连接服务
- TCP: 面向连接传输控制协议(Transport Control Protocol): 由于提供了可靠的传输服务,因此需要增加许多开销,如
确认
,流量控制
,计时器
,连接管理
等,这些协议都附加在报文的首部,也需要占用处理机的相关资源,它是一种可靠的全双工工信方式,因此TCP适用于可靠性连接高的场景,如文件传输协议(FTP),超文本传输协议(HTTP),远程登录协议(TELENT)等。 - UDP是一个无连接的非可靠传输层协议: 他在IP之上提供了两个附加服务,多路复用和对数据进行错误检查,IP知到怎样把分组投递给一台主机,但不知道怎样将其投递给具体主机上的应用,所以它不需要连接,远层主机接受到报文后,并不需要给出任何确认. 所以UDP比较简单,执行速度快,实时性好,使用UDP的应用主要包括
小文件传输协议(TFTP)
,DNS
,SNMP
和实时传输协议RTP
UDP协议
- RFC 786定义UDP只是做了传输层协议能够做的最小工作:他尽在IP的数据服务之上增加了2个基本的服务: 复用分用以及差错检测,如果应用层序选择UDP则几乎是直接同
IP
打交到 - UDP的优点
- 无需建立连接,节省数据传输的时间,DNS的解析使用UDP,HTTP不使用UDP
- 无连接状态,TCP是需要建立连接的
- 减少首部开销, UDP首部占有
8B
,而TCP首部占有20B
- 由于UDP只管发送,不关注是否有无收到,不需要确认等待,所以应用层能更好的控制发送数据和发送时间,因此网络中的拥堵并不会影响主机的发送效率,针对一些实时性要求较高的的应用需要稳定的发送速度,如流媒体,能容忍一些数据的丢失,但不能容忍较大的延迟,UDP正好满足了这些应用的需求。
使用范围
- 使用于一次性传输较少的数据,如DNS,SNMP,这是因为可靠性不高,需要多发送几次
- 它其虽然不回等待确认接受方是否成功接受到,但也是尽量努力的去交付数据,因此所有维护传输可靠性的工作转移到了用户应用层去完成,应用进程根据具体的要求来设置可靠的传输机制。
- UDP也是面向报文的,发送方UDP对应用层提交的报文,在添加首部后就向下交互给了IP层,不合并也不拆分,而是保留这些报文的边界; 同样的接受方UDP对IP层提交的数据拆除首部之后得到原始的报文
- 因此UDP的最小传输单元是报文,一次交互一个完成的报文,此报文无法进行分割
举个古代通信的方式
- TCP: 通过人工传送书信,必须当面交换本人确认并返回信息,可靠连接
- UDP: 通过鸽子传送书信,鸽子在路上容易被劫杀,迷路,饿死,累死,跑路,联络方搬家,鸽子找不到等等,所以通常需要多发送一些鸽子,所以它是不可靠的连接。(这里在暂时不考虑人在路上传送意外的情况)
UDP的首部格式
- 源端口: 发送报文的进程端口
- 目标端口: 接受报文的进程端口
- 长度: UDP数据报的长度,包括首部数据,最小值为8
- 校验和: 检测UDP数据在传输过程中是否有出现差错,有错则丢弃,该字段是可选的,当源主机不想计算时直接将令该字段全部为0.
UDP的校验,UDP是通过伪首部来进行校验,伪首部只有在计算检验和的时候才会出现,不向下传递也不会向上递交
- 下图
0
代表全名字段 17
是一个协议字段值,指定传输层使用哪种协议,UDP的协议字段值为17,还有很多的其它协议字段- UDP长度: UDP的首部8bytes加上UDP数据部分的总长度
- 检验过程-发送端工作:
- 加上伪首部,(伪IP首部)
- 全0填充检验和字段
- 全0填充数据部分(UDP数据报以4字节单位串连,不足部分补0)
- 伪首部+首部+数据部分 采用二进制反码求和.
- 把求和反码填入填入检验和中(校验和)
- 去掉伪首部发送. 所以说伪首部是检验过程中间临时生成的辅助数据,使用完就去掉
- 检验过程-接受端工作:
- 填写上伪首部
- 伪首部+首部+数据部分采用 二进制反码求和(所谓的二进制反码求和,即为先进行二进制数取反,然后求和,如果最高位进一,则保存到最低位即可。)
- 结果全部为1则说明没有差错,否则丢弃该数据,交给上层应用并加上差错警告
- 下图
TCP协议
TCP协议是在不可靠的IP层上实现的可靠数据传输协议,它主要解决传输的可靠,有序,无丢失和不重复问题,主要特点如下:
- TCP是面向连接的传输层协议
- 每个条TCP连接包括2个端点,它是基于点对点通信的(不同主机的两个进程端口通信)
- TCP提供可靠的交互服务,提供数据无差错,不丢失,不重复且有序的传输
- TCP提供了全双工通信,允许通信双方的应用进程在任何时候都能收发送数据
- 所以TCP的两端都需要设置发送缓存和接受缓存
- 缓存数据包括以下部分:
- TCP准备发送的数据
- TCP已发送未收到确认数据,防止丢失需要重发
- 按序到达接受方TCP,未被应用程序读取的数据,(如播放视频,应用程序解码阻塞)
- 不按需到达的数据,比如传递了4个数据报,最后一个先到达
- 面向字节流: TCP把应用程序交下来的数据视为一连串的无结构的字节流,例如AsyncSocket中的数据传输均需要封装层data发送,我们可以在字节流的首部加上固定标志位来定义的自己的格式,通过此方法封装一套自己的协议,但这些都属于私有的协议,业界已有很多通用的协议。
TCP报文段格式
- TCP的报文段首部最短是20B,后面有4N(4字节的整数倍),是根据需要添加的的可选项。
- 源端口可目标端口各占 2B,同UDP一样,均需有发送和接受的端口,因为是面向应用层的,实现进程的数据通信
- 序号字段: 占4B, 因为TCP是面向字节流的,所以TCP传送的数据中每个字节都编上一个序号,该序号表示的是数据的第一个字节的序号.(在发送时TCP会将字节流进行分组发送,为每组数据的第一个字节指定一个序号,用于告诉接受方它门的顺序,防止数据错乱), 本次发送的数据第一个字节的序号
- 确认号字段: 同样也占4B,它和序号字段是一对, 本次请求接收对象的数据的第一个字节的序号,通常会结合上下文场景接受的序号加1加上接收的数据长度再次请求
数据偏移: 占4bit,即首部长度,这是因为TCP的首部可以根据需要进行扩展,这里指定数据距离原始的20B最小的TCP首部大小的偏移位置,用于区分TCP首部的扩展字段
- 紧急位URG: 当URG=1时,标明紧急指针字段有效,他告诉系统报文段中有紧急数据,应当尽快传输, URG需要配置
紧急指针(URG point)
使用,从数据的第一个字节到紧急指针所指的字节就是紧急数据. - 确认位置 ACK:全称acknowledge, 只有当
ACK=1
的时候确认号才有用。TCP规定在连接建立后所有传送的报文都必须要把ACK
设置为1
. - 推送位置PUSH: 当
PUSH=1
的时候,TCP要求将此报文尽快的传递给应用进程,不用等到整个TCP的发送缓存都满的时候再发出。 - 复位RST(Rest):
RST=1
的时候说明TCP连接出现了严重的差错(如主机崩溃或其它原因),需要释放连接后重新连接. - 同步位(SYN): 同步
SYN=1
的时候说明TCP是一个请求连接或连接接收报文。 - SNY=1, ACK=0时,标明这是一个请求连接报文,若对方同意连接则返回 SYN=1, ACK=1.
- 终止位(FIN): 释放一个连接.
FIN=1
标示此报文的发送方数据已经发送完毕,并要求释放连接。 - 窗口字段: 占2B,2个字节,它指允许对方发送的数据量,接受方的数据缓存空间是有限的,为了避免发送过多数据,设置一个窗口大小,告诉发送方最多能接受多少数据。
- 假设发送方指定确认号701(请求的下一个字节流的首个字节的序号),窗口字段为1000
- 接受方收到此信息后最多只能一次发送到1700的字节序号。
- 紧急位URG: 当URG=1时,标明紧急指针字段有效,他告诉系统报文段中有紧急数据,应当尽快传输, URG需要配置
校验和: 占2B,和UDP几乎一样,伪首部的协议字段因为是TCP,所以需要将UDP的协议字段
17
改为TCP的协议字段6
。紧急字段指针: 配合
URG
搭配使用,从数据第一个字节到紧急字段指向的字节为紧急数据,需要优先处理。选项字段: 长度可变,占4字节的整数倍,主要是用来对TCP基本的首部字段不满足时候的补充,TCP最初规定了一种选项,即最大报文长度(Maximum Segment Size, MSS), MSS是TCP报文段中的数据字段的对打长度.
填充字段: 为了是这个首部长度为4B的整数倍,方便协议格式的统一,程序猿阅读,以及代码编写时的首部协议字段进行解析。
TCP连接管理
- 概念: TCP时面向连接的协议,每个TCP连接都需要有3个阶段,建立连接,数据传送和连接释放。
- 在建立连接时需要使每一方都能知道对方的存在
- 要允许双方协商一些参数(如最大窗口值,是否使用窗口扩大选项,时间戳选项即服务质量等),如常见的超时连接
- 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。
连接过程:
- step1: 发送请求连接请求报文:
SYN=1, seq=x(随机)
,ACK默认为0, 其中SYN
为TCP首部中6个关键字段之一,代表请求建立连接或返回连接报文,这里搭配seq
的随机数,标示请求连接;seq
则是指TCP首部中的序号
,随机先发送一个数据问候接受方; 需要特别注意,此处是不需要传入ack确认序号的,因为没有对方的任何信息,不知道要获取接收方具体的数据.而且可以看到初始化的ACK默认为0,这也说明了此时的确认序号ack
是么有意义的服务器为该TCP连接分配缓存和变量
,并向客户端返回确认报文段,允许连接,此时还没有应用层数据.
- step2:服务器为TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据
- ·SYN=1,seq=y(随机),ack=x+1, 在服务器回复同意连接报文段的同时,发送数据字节流序号
seq
为随机分配(因为发送方的请求连接时的请求确认序号ack没有意义),同时将自己的ack确认序号设置为发送的序号+1(ack=x+1,表示希望得到客服端的下一个字节流的数据)
- ·SYN=1,seq=y(随机),ack=x+1, 在服务器回复同意连接报文段的同时,发送数据字节流序号
step3: 客服端为TCP连接分配缓存变量和,并向服务端返回确认报文,同意服务端的请求连接建立,可以携带数据
SYN=0, ACK=1, seq=x+1,ack=y+1
,seq=x+1
是因为请求确认序号为ack=x+1
,ack=y+1
是因为发送方的seq=y
.
TCP的洪泛攻击: 从上面可以看出,客服端第一次发送请求报文后,服务器会初始化缓存资源并并回复客户端同意并请求和客户端建立TCP连接,此时如果客户端为攻击者不进行回复,而是反复的请求
SYN=1,seq=x(随机)
,则会造成服务器大量的TCP连接被挂起,造成CPU和内存的浪费,最终死机无法工作;- 增对这一点通常需要设置 SYN Cookie来进行限制.
- step1: 发送请求连接请求报文:
TCP的连接释放
- step1: 客服端发送连接释放报文,停止发送数据,主动关闭TCP
- FIN=1, seq=u, FIN为结束连接标志符,seq为本次发送的数据
- step2: 服务端返回一个确认报文段,客服端这个方向的连接就释放了,此时处于半关闭状态
- ACK=1,seq=v,ack=u+1,
此处seq为v,是因为发送方seq=u
,服务端检测到有序需要传送,先把每发完的数据发送出去
- ACK=1,seq=v,ack=u+1,
- step3: 服务端发送完后去,就发出连接释放报文段,主动关闭TCP连接.
- FIN=1, ACK=1, seq=w,ack=u+1,
seq=w
是根据服务器第二步发送的数据量字节序号累加的,step2,step3之所以两次的请求确认序号都是ack=u+1
,是因为在第一步客服端释放连接时的序号为u,服务端请求的下一条数据自然是u+1
了。
- FIN=1, ACK=1, seq=w,ack=u+1,
step4: 客服端返回一个确认报文段,等到时间等待计时器设置的2msl(最长报文寿命)后,连接自动关闭
- ACK=1,seq=u+1,ack=w+1, 等待的原因,是为了防止此报文段丢失,导致服务端重新执行第三步骤.
关键点
- 从上面的过程分析, TCP请求连接和断开连接分别为3步和4步
- 在请求连接和断开连接的过程中,
它们的ack和seq初始值都是随机产生的,后面每次握手确认,需要在原来基础上+1
- 为了保障数据报文的有效接受,最后关闭的时候需要等待一定的时间,确保发送的报文没有失败再关闭。
- step1: 客服端发送连接释放报文,停止发送数据,主动关闭TCP
TCP的可靠传输
TCP实现可靠的传输机制主要是通过以下4个步骤来实现的
- 校验: 与UDP校验一样,通过创建伪首部校验。
- 序号: 对字节流分块传输,并对每一块的第一个字节标上序号,一次发送。 通过ack请求序号和seq本次发送的序号实现。
- 确认: 通过在一定的等待时间内检查发送的序号最终是否连续,累计确认,没到达就要求重传。
- 重传: 在规定时间内没有收到接受方的确认,对报文进行重传,即超时重传。
- TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间), Re transfer time.
- 冗余ACK(冗余确认): 当比期望序号达的失序报文到达时,就发送一个冗余的ACK,指名下一个期待的字节的序号
- 如果发送方收到了3个冗余的ACK,则确认这个报文段丢失,需要重传,这种方式称为快速重传。
TCP的流量控制
- TCP利用滑动窗口机制来实现流量控制
- 在通信过程中,接受方根据自己接收缓存的大小,动态的调整发送方窗口的大小,即接
接收窗口rwind
(接收方设置确认报文段的窗口字段来将rwin通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd最小值
- TCP为每一个连接设置有一个持续计时器,只要TCP连接的一方接收到对方0窗口通知,就启动一个持续计时器
- 若持续计时器设置时间到期,就发送一个零窗口的
探测报文段
,接收方收到探测报文段时给出现在的窗口值 - 若窗口值仍然为0,那么发送方就重新设置持续计时器。
- 通过这个机制可以打破窗口为0的限制。避免了接受缓存溢出时窗口为0互相等待的局面。
TCP拥塞控制
- 出现拥塞的条件:
- 单位时间类接受到的资源小于自己所需要的资源,如看电影丢帧卡顿,游戏数据上抛延迟等等
- 很多原因都会导致拥塞: 如网络性能变坏,吞吐量下降,路由器坏损,丢包率多,算法出现bug,
- 拥塞控制:
- 防止过多的数据注入到网络中: 针对网络资源的所有主机协调上网,如分时段,分带宽,全局性的管理
- 拥塞控制的四种算法
- 慢开始
- 拥塞避免
- 快重传
- 快回复
- 基于下面条件固定来讨论
- 数据单向传递,而另外一方只负责确认
- 接受方总是有足够大的接受空间,因而发送窗口的大小取决于拥塞大小
- 发送窗口 = Min(接口窗口rwnd, 拥塞窗口cwnd)
- 接受窗口: 接收方根据接受缓存设置的值,并告知发送方,反应接受方容量
- 拥塞窗口: 发送方根据自己估算网络用塞程度而设置的窗口值,反应网络当前容量
慢开始和拥塞避免
- 慢开始和下载视频刚开始慢,一段时间后速率稳定下来的特点很类似
- 横轴为发送的报文段,根据
一个传输轮次(发送一个报文到接受,RTT)
判断当前的拥塞情况,调整窗口大小 - 一个往返时延
RTT
: 开始发送一批用塞窗口内的报文段到开始发下一批用塞窗口内报文段的时间,单个和按最近时间段批量统计,视情况调整矿口.
快重传和快恢复
- 3个重复的ACK确认说明期待的序号没有到达,需要重传, 表明窗口需要调整,提前避免大量重传
传输层的总结
Mac查看端口网络流量与端口
lsof -i 6 # IPV6连接查看
lsof -i 4 # IPV4连接查看
lsof -i:port #查看端口进程号
kill -9 port #杀掉某个进程,比如进程错误退出,占用端口可以通过此命令杀掉