计算机网络 第五章 传输层
一、传输层概述
1. 功能
1传输层提供进程和进程之间的逻辑通信;
网络层为主机间的通信提供服务,但是仅仅将数据传送到主机并没有通信结束,只有将数据送交到具体的进程或者进程中具体的线程才能实现通信的过程;因此网络层的通信并未完成,需要传输层实现进程与进程之间的逻辑通信;逻辑就是表示表面是进程之间的通信,但实际上是从上至下封装,再从下至上解封装的过程
2
- 复用和分用复用:发送方不同的应用进程,比如qq微信,都可以使用同一个传输层的协议来传送数据分用:接收方在传输层解封装后,能将数据送交给对应正确的进程
3传输层对收到的报文进行差错检测
网络层有首部校验和,但只是校验首部,没有校验数据部分,因此就需要传输层实现对数据的检错,而网络层的数据部分就是传输层的报文段,因此传输层对这个报文段进行了差错检测,网络层就不需要对数据部分进行差错检测,检测IP数据报的头部即可
4
- 传输层并不一定实现可靠传输,因为有两种协议TCP、UDP
2. 传输层两个协议
3. 传输层的寻址与端口
常见的应用程序端口号:
二、UDP协议
无连接不可靠的服务
1. 概述
注意:
应用层给UDP多长的报文,UDP就会照样发送一整个完整的报文给网络层;
因此当报文长度过大时,网络层就需要对其进行分片,又因为接下来要传给链路层有MTU的限制,降低了网络层的效率;如果应用层报文很小时,网络层IP数据报数据部分就会很小,相对于IP首部小很多,同样会降低网络层效率,因为首部附加信息相比来说应该尽可能小
UDP适用于实时应用的原因:实时应用要求延迟很低,丢一点数据不影响
2. UDP首部格式
源端口号
可有可无,如果发送的数据报需要接收回复,就添上;如果不需要收到回复,则可以设置全0目的端口号
一定要有UDP长度
是指整个UDP数据报的长度 = 首部字段 + 数据字段UDP检验和
检测整个UDP数据报是否有错,也就是首部字段+数据字段,如果出错,直接丢弃;
3. UDP校验
三、TCP协议
有连接不可靠的服务
1. 特点
面向连接:使用TCP前必须先建立连接,传送数据完毕后再释放连接;虚连接表示表面上看上去是两个进程之间直接通信,但实际物理线路上需要从上而下封装再从下而上解封装
每一个TCP连接只有两个端点,也就是每一个TCP连接都是点对点、一对一的。所以TCP协议无法广播、多播
TCP提供可靠交付的服务,不丢不重,按序到达
TCP提供全双工通信。两方可以同时发数据也可以同时接收数据,所以TCP连接的两端都会设置发送缓存和接收缓存
TCP面向字节流:流是流入进程或从进程中流出的字节序列,虽然应用进程和TCP的交互是一次发送一个数据块,但是TCP会把交下来的数据仅仅看成一连串的无结构字节流
2. TCP报文段首部格式
六个控制位:
URG
和PSH
区别图示:
- URG是从发送缓存中插队优先发送
- PSH是从接收缓存中出来上交应用层
3. TCP连接管理(三次握手)
第一次握手:[mark]客户端A向服务器B发送连接请求[/mark]
SYN=1:客户端A向服务器B发送连接请求报文
seq=x(随机):因为还没有数据,序号位随机产生
第二次握手:[mark]服务其B收到来自客户端A的连接请求报文段,同意A建立连接,返回连接确认[/mark]
SYN=1:服务其B返回连接接收报文
ACK=1:连接建立之后的ACK必须都置为1
seq=y(随机):因为还没有数据,序号位随机产生
ack=x+1:与ACK成对出现,表示期待对方发送的第一个字节序号,之前客户端A发送的连接请求报文没有数据部分,即序号x标志着前面发的连接请求报文,所以服务端B想要收到的是序号为x+1的数据
第三次握手:[mark]客户端A收到了来自服务器B的连接接收报文,要返回一个确认的确认[/mark]
SYN=0:SYN只有在连接请求和连接接受时才是1
ACK=1:连接建立之后的ACK必须都置为1
seq=x+1:客户端A发送的报文段的第一个字节就是x+1,之前已经发送了序号为x的数据
ack=y+1:前面服务器B发送了序号为y的连接接收报文,所以此时客户端A期待收到序号服务器B发送序号y+1的数据
上述第二次握手和第三次握手,服务器和客户端分别为TCP连接的过程分配了缓存和变量,就会导致一下SYN洪泛攻击的问题
4. TCP连接释放(四次握手)
第一次挥手:客户端发送连接释放,停止发送数据,主动关闭TCP连接
FIN
=1:客户端A请求释放连接seq
=u:表示请求释放连接报文段第一个字节序号,但是这个报文通常没有数据,所以该序号标识这个连接释放报文段
第二次挥手:服务器收到客户端的连接释放请求,返回对释放连接的确认,客户端到服务端连接半关闭
ACK
=1:连接建立之后的ACK必须都置为1,此时连接还没完全释放seq
=v:发了好多数据,这里只是用v指代一下ack
=u+1:期待收到客户端A发送的第一个字节序号为u+1的报文段
此时客户端A收到服务器B发来的连接释放确认报文段不需要回复,因为客户端A已经结束通话,只需要等待服务器B告诉它服务器也结束,此时服务器B还可以发送数据
第三次挥手:[mark]服务器发送完数据,发送连接释放报文段,主动关闭TCP连接[/mark]
FIN=1:服务器B发送连接释放报文,此时连接还没完全释放
ACK=1:连接建立之后的ACK必须都置为1
seq=w:发了好多数据,这里只是用w指代一下
ack=u+1:之前客户端A说发送的是第一个字节序号为u的数据,所以此时服务器B希望收到首字节为u+1的数据,但由于不发数据了,所以第二段第三段的ack都是u+1
第四次挥手:[mark]客户端A收到来自服务器B的连接释放报文,返回一个确认报文[/mark]
ACK=1:连接建立之后的ACK必须都置为1,此时连接还没完全释放
seq=u+1:之前发的数据时第u位数据,B也要第u+1位数据,所以我发第u+1位数据
ack=w+1:之前发送方(B)说发送的是第w位数据,所以我(A)要的是w+1位数据
此时TCP连接不是立马结束,而是等待2MSL之后,TCP连接才彻底释放,主要原因是防止客户端返回的确认报文丢失,给2MSL时间,如果丢失,则服务端重传连接释放报文段,A在2MSL之内收到重传的报文段,A在重新返回确认,也重新启动2MSL计时器
5. TCP可靠传输
[title]网络层提供最大努力交付,是不可靠传输;因此需要上一层传输层担起可靠传输的职责;传输层有UDP、TCP两大协议;其中UDP不可靠,TCP可靠,因此网络层不能可靠传输的话,传输层就可以通过使用TCP协议保证可靠传输;如果传输层使用的UDP协议,就需要再最上一层应用层实现可靠传输[/title]
TCP一共有四种实现可靠传输的机制:校验
、序号
、确认
、重传
1. 校验
[title]与UDP校验一样,在发送方和接收方增加一个伪首部,通过使用二进制反码求和的计算方法,判断有没有出错[/title]
2. 序号
[title]TCP协议面向字节流,因此TCP以字节为单位进行传输,会给每个字节编上序号;
实际发送的时候以报文段为单位,将一些字节合在一起组成报文段
[/title]
3. 确认
有了序号机制保证了数据能够有序的提交给应用层,基于序号机制也就有了确认和重传机制
发送方给接收方发送123字节组成的第一个报文段,接收方收到后存储在TCP缓存中,然后选择合适的时间将缓存中的报文段提交给应用层;此时发送方TCP缓存中仍会存在123报文段,为了保证报文段丢失能够重传
4. 重传
[title]确认机制和重传机制密切相关:如果报文段按序完整到达,接收方就会返回确认告诉发送方接下来要发送哪一个报文段;如果没有按序到达,接收方就会返回确认报文指示发送方应该重传哪一个报文段[/title]
6. TCP流量控制
TCP使用滑动窗口机制实现流量控制
- 接收窗口
rwnd
- 拥塞窗口
cwnd
发送窗口取决于rwnd
和cwnd
的最小值
7. TCP拥塞控制
拥塞控制有四种算法,通常两两组合使用