文章目录
5.1 概述和传输层服务
传输层的功能类似于一道门,处于应用层和网络层中间(Api),实现端到端的数据传输。我们知道一个电脑可能有多个进程同时在使用网络连接,那么网络包达到主机之后,怎么区分自己属于那个进程?这就需要靠传输层的作用了。
传输层协议能提供应用的多路复用/分用服务、可靠数据传送、带宽保证及延迟保证等。
这张ppt的内容相当于本章的核心内容解读
5.2 套接字编程
在网络编程中,一般是应用socket(套接字),此处的内容可以参考博客
在一般的工作面试中会经常考察套接字编程的知识,主要是看面试者对于网络编程的了解程度,紧接着问在具体场景下的问题。
先了解一下常用的C/S(客户端服务器)模式特点
- 服务器进程一直在监听套接字等待客户的连接请求
- 客户端创建本地套接字,与服务器的监听套接字通信
- 收到连接请求之后创建连接套接字(原来的继续监听)
- 服务器进程回到监听套接字上继续等待
- 结束后释放相关资源
这里再简单说一下客户端和服务端建立连接的一整个过程。
- 首先是服务器端创建套接字绑定服务端口,然后一直监听客户端的请求,而客户端创建套接字发送connect请求之后通过TCP协议建立连接。
- 接下来是,客户端发送写请求,假设内容是“hello,I‘m client”,然后是服务器端先读请求再处理请求,假设这里的处理就是显示该内容到显示器。接着,服务器端写一个“hi,I’m server”发给客户端,客户端同样可以先读取然后处理请求显示,原理类似。
- 由于请求可能不止一个,所以客户端和服务器端需要循环处理,也就是会有一个回溯的箭头,这样双方就可以一次发送和接受多条消息了。
- 完了之后,两者可以自行关闭连接。
对于主机可以使用IP地址标识,那么主机上的进程如何标识自己?
一个IP地址主机有很多的网络服务,所以需要给与端口来区分不同进程
端口号一般是两个字节16位(0-65535),以下是基本的端口知识:
故进程标识需要两个信息
- 主机的IP地址
- 该进程与主机关联的端口
PS:这里可以先从套接字的角度了解一下TCP三次握手和四次挥手的过程
5.3 传输层的复用和分用
- 发送端复用
传输层从多个套接字收集数据,交给网络层发送 - 接收端分用
传输层将网络层的数据交付给正确的套接字(目的端口)
复用相当于发送方将收集到的套接字标识放到报文段中,由于套接字对应的AP往往不止一个,所以会重复封装成TCP/UDP报文,放在一起然后打包给网络层,实现IP复用
而分用相当于接收方需要区分传输层报文段中的套接字标识,将报文段交给正确的套接字
e.g., UDP分用
这里的UDP分用,使用二元组的形式,但是对于服务器端来说,只要报文的<目的IP地址,目的端口号>是一致,那么服务器使用同样的套接字响应服务,不做区分(如下图)
e.g., TCP分用
这里说明的很清楚,除了监听及之前的部分和UDP的内容一致以外,TCP为了保障的可靠性,在连接的时候为每个客户创建唯一的连接套接字(四元组),注意这里的四元组中的目的端口号仍然是监听套接字的端口号,但这可以使得客户进程的信息不相互干扰(如下图,服务器往往是多线程的)。
5.4 无连接服务:UDP
服务
- 通过端口实现进程之间的通信
- 报文检错(可选):UDP校验和计算方法和之前的数据链路层一致,校验和字段可以置0
优点
- 简单,首部长度只有8个字节
- 发送和接受快
适用范围
3. 容忍丢包不能延迟:如流媒体
4. 单次请求或者响应:如dns
5. 基于UDP的应用层:应用层实现可靠
关于UDP的报文长度范围
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。
我们从下到上分析一下:
- 在链路层,由以太网的物理特性决定了数据帧的长度为[ (46+18) , (1500+18) ],其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;
- 在网络层,因为IP包的首部要占用20字节,所以这时的MTU为1500-20=1480;
- 在传输层,对于UDP包的首部要占用8字节,所以这时的MTU为1480-8=1472;
同理,我们可以得到TCP的MTU是1480-20 = 1460
在用UDP局域网通信时,经常发生“Hello World”来进行测试,但是“Hello World”并不满足最小有效数据(64-46)的要求,为什么小于18个字节,对方仍然可用收到呢?
因为在链路层的MAC子层中会进行数据补齐,不足18个字节的用0补齐。但当服务器在公网,客户端在内网,发送小于18个字节的数据,就会出现接收端收不到数据的情况。
以太网EthernetII规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。
5.5 面向连接的服务:TCP
概要
网络层中IP协议是尽力而为的去交付,无法保证数据的可靠性,这个问题就只能留给传输层TCP解决。
TCP报文段结构
首部长度 (4位) : 报文头长度 (单位: 位) /32
1000(转化为10进制为8,8*32/8 = 32,该报文报头长度为32个字节)
存在该字段是因为TCP报头中任选字段长度可变,报头不包含任何任选字段则长度为20字节(包括源端口2B,目的端口2B,序列号4B,确认序号4B,接收窗口2B,头长度4位,控制标志位12位,其中未使用6位,校验和2B,紧急指针2B)
4位所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节
TCP可靠数据传输
背景知识
有限状态机(FSM)
横线上方是引起的原因,下方是执行事件/动作
-
理想状态下(没有差错和丢包)
-
有位差错的解决(发送方属于“停等”状态)
发送方:
- 需要对数据包进行检错编码,给与接收方检查报文的正确性
- 等待ACK/NAK的信息,根据接收方的接受状态决定重传或者继续
接收方: - 需要校验
- 校验成功,返回ACK报文
- 校验失败,返回NAK报文
这里没有考虑到ACK/NAK确认报文有可能会出错,此时发送方无法判断接收方是否接受成功,只能重传数据,那么有可能导致接收方反复接受相同的数据,需要特定添加控制字段辅助判断该数据是旧数据还是新数据,丢弃旧数据。
这里导入的控制字段就是所谓的序列号,标识数据传输序列。
有可能在接收方等待1的过程中,会收到0或者1的报文(ACK报文可能出错)
这里有一个间接ACK思路
这里的isACK(rcvpkt,1)表示我当前是上一次的确认消息,证明此次传输的0数据出错了。
- 面对报文丢失的场景3.0
发送方的有限状态机
接收方的有限状态机
GBN和SR算法了解即可,作为背景知识
TCP实现
这里的TCP是简化版本,具体的协议内容可见考研课
报文重传
为了避免超时重传的诸多问题,提出了快速重传来提高吞吐量
细节很多,需要仔细捋一捋
这里有关于超时重传时间的选择部分,主要是看对于重传时间的计算(RTTd公式中的RTTs是之前的)
这里举例说明如下
TCP流量控制
接收端的缓存有限,消费比较慢
需要通告可用的窗口大小,通过返回确认报文的时候通告窗口大小
接收方启发式:通告零窗口之后,仅当窗口大小显著增加之后才发送更新的窗口通告
发送方启发式:Nagle算法
滑动窗口
TCP连接控制
- TCP的三次握手
- 四次挥手,关闭TCP连接
注意关闭连接的时候客户端不能发送,但是为了等待发送方将数据发送完,然后客户端缓冲这些数据慢慢处理,直到服务器端发送FIN = 1的报文
最后需要等待2*MSL的时间有两个目的
- 等待旧的报文再网络中完全消失,不会影响到新的TCP连接。
- 防止服务端未收到ACK报文,超时重传而客户已关闭的局面发生。
TCP拥塞控制
理解网络拥塞
网络拥塞的解决
调节策略
AIMD(乘性减,加性增)
调节算法
-
慢启动
保持指数型增加直到达到上限 -
拥塞避免
-
快重传:收到三次重复确认的ACK报文,发送方直接重传丢失的报文
-
快恢复:在快重传的基础上,发送方进入快速恢复状态,将拥塞窗口减半,并继续发送数据。
湖科大的算法总结图示
传输层的知识点就到这里,欢迎大家批评指正!