知识架构树
1 传输层提供的服务
1.1传输层的功能
- 提供应用进程之间端到端的通信。(区别网络层:主机与主机之间的通信)
- 复用和分用。
复用指发送方不同应用进程都可以使用一个传输层传送协议。
分用指接收方的传输层在剥去报文首部后报数据正确交付给目的端口。
- 对报文进行差错检测(首部和数据部分),网络层只检查IP数据报首部,不检验数据是否出错。
- 提供两种不同的传输协议(UDP和TCP),但是网络层无法同时事项两种协议(要么数据报,要么虚电路)
解决一个疑问:上层传输层TCP连接,可靠传输,而下层网络层,尽最大努力交付,不可靠,线路传输时,由下至上,又由下至上传到进程中,这中间有可靠传输的又有不可靠传输的,怎么就可以说传输层采用连接是可靠的呢?答:当传输层采用面向连接的TCP时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道。
1.2传输层的寻址与端口
①端口的作用
找到主机中的应用进程
②端口号
端口号长度16bit,能够表示=65536个不同的端口号,只标识本计算机应用进程层中的各进程。根据端口号的范围分为两类:
③套接字
套接字:socket(IP地址:端口号),唯一地标识网络中的一台主机中的应用进程。
1.3 无连接服务与面向连接服务
面向连接服务(TCP)指在双方在进行通信前,必须先建立建立连接,在通信过程中,整个连接的情况一直被实时地监控和管理,结束通信之后,应当释放这个连接。
无连接(UDP)指两个实体之间通信不需要建立好连接,在通信时,直接将信息发送到网络中,尽最大努力交付。
2 UDP协议
2.1 UDP数据报
①UDP概述
UDP在IP数据报服务之上增加了两个最基本的服务:复用和分用以及差错检测。
UDP虽然不可靠, 但是人家也还有其他特点。
②UDP首部格式
UDP首部有8B,由4个字段组成,每个字段的长度2B
- 源端口。在需要对方回信时选用,不需要全0即可
- 目的端口。在终点交付报文会用到
- 长度。包括首部和数据,最小值为8
- 校验和。检验UDP数据报在传输中是否有错。有就丢弃,反之,不需要全0即可。
数据报交付流程:
UDP数据报在向上交付时,根据首部中目的端口,交给应用进程,如果接收方发现该报文的目的端口不存在本主机中,丢弃报文,并由ICMP发送“端口不可达”差错报文交给发送方。
2.2 UDP检验
在计算校验和时,要在UDP数据报之前增加12B的伪首部,去计算校验和。
伪首部既不向上传递,又不向下递交,在计算完校验和之后,伪首部就被干掉了。
UDP校验和的方式和IP数据报首部检验和的计算方式类似,不同的是,IP数据报校验和只校验IP数据报首部,而UDP数据报的校验是检查首部和数据部分。
详细过程:
在发送端:1.填上伪首部
2.全0填充校验和字段
3.全0填充数据部分(UDP数据报要看成许多4B的字串接起来)
4.伪首部+首部+数据部分采用二进制反码求和
5.把求和反码填入检验和字段
6.去掉伪首部
在接收端:
1.填上伪首部
2.伪首部+首部+数据部分采用二进制反码求和
3.结果全为1则无差错,否则丢弃数据报/交给应用层附上出差错的警告
3 TCP协议
3.1 TCP协议的特点
在不可靠的IP层至上实现可靠的数据传输协议,主要解决传输的可靠、有序、无丢失和不重复问题。
3.2 TCP报文段
TCP传送的单元称为报文段,既可以用来运载数据,又可以来建立连接、释放连接和应答。
- 源端口和目的端口。各占2B,传输层对复用和分用都要通过端口实现。
- 序号。占4B,范围0~-1,因为TCP是面向字节流的,所以TCP连接传送中的每个字节都按照顺序编号。
- 确认号。占4B。两个作用:①期待对方要发给我的下一个报文段的第一个字节的序号 ②标识前 n-1位我都接收到了
- 数据偏移(首部长度)。占4bit,指出TCP报文段的数据起始处距离TCP报文段的起始有多远。以4B为单位
- 保留。6位
- 紧急位URG。URG=1时,标识该报文段为高优先级数据
- 确认位ACK。当连接建立所有传送的报文段都为1
- 推送位PUSH。接收方,收到PUSH=1的报文段,尽快发给应用进程,不要在等缓存满了再交
- 复位位RST。RST=1时,表明TCP连接出现严重差错,必须断开连接,再重新建立传输连接
- 同步位SYN。SYN=1,表示这是一个连接请求报文或连接接受报文。eg:SYN=1,ACK=0,这是连接请求报文;SYN=1,ACK=1,这是连接接受报文
- 终止位FIN。用来释放连接,当FIN=1时,表明此报文段的发送方的数据已经发送完毕,要求释放连接。
- 窗口。占2B,范围:0~,指出允许对方发送的数据量。因为接受缓存空间有限
- 校验和。占2B,检验字段范围包括:首部和数据。协议字段为6,UDP为17
- 紧急指针。占2B,当URG=1时才有意义,指出本报文段中紧急指针数据有多少字节。
- 选项。规定了最大报文长度(MSS)
- 填充。为了使整个首部长度是4B的整数倍
3.3 TCP连接管理
TCP连接都有三个阶段:连接建立、数据传送和连接释放。
TCP连接的端口是套接字或插口,每条TCP连接唯一地被通信地两个端点确定。
TCP连接采用客户/服务器模式。主动发起连接建立地应用进程为客户,被动等待连接建立的应用采用进程称为服务器。
①TCP连接的建立
第一步:客户机的TCP首先向服务器的TCP发送连接请求报文段。SYN=1,再随机选择一个初始序号seq=x。规定:SYN报文段不能携带数据,但要消耗掉一个序号。这时,TCP客户机进入SYN-SENT(同步已发送状态)
第二步:服务器的TCP收到连接请求报文段后,如果同意建立连接,则发回确认,并为该TCP连接分配缓存和变量。SYN=1,ACK=1。归定:确认报文段不能携带数据,但要消耗掉一个序号。这时,TCP服务器进入SYN-RCVD(同步收到状态)第三步:客户机收到确认报文段后,要向服务器给出确认,并为该TCP连接分配缓存和变量。ACK=1。该报文段可以携带数据,这时,TCP客户进程进入ESTABLISHD(已建立连接)状态。
值得注意的是,服务器的资源是在第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的。
②TCP连接的释放
第一步:客户机要关闭连接时,此时会向TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接。FIN=1,FIN报文段不携带一个数据,但是要消耗一个序号。
这时TCP客户进程进入FIN-WAIT-1(终止等待)状态。TCP是全双工工作模式,关闭了一端,另一端仍旧可以发送数据。
第二步:服务器收到连接释放报文段后,发出确认。服务器进入CLOSE-WAIT(关闭等待)状态。此时,客户机到服务器这个方向的连接就释放了,TCP处于半关闭状态,但是服务器要发送数据,客户端仍要接受。第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接。FIN=1,还要发送同样的ack序号。进入LAST-ACK(最后确认状态)
第四步:客户机收到连接释放报文段后,必须发出确认。ACK=1。
值得注意的是,TCP连接还未释放,必须等待计时器设置的时间2MSL(最长报文段寿命)后,客户机才进入CLOSED连接关闭状态。
3.4 TCP可靠传输
TCP提供的可靠数据传输服务保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样。
TCP使用校验、序号、确认和重传机制来达到这一目的,校验和同UDP。
①序号
指本报文段所发送的数据的第一个字节的序号。
②确认
首部的确认号是期望收到对方的下一个报文段数据的第一个字节的序号。
TCP默认使用累计确认,只确认数据流中第一个丢失字节为止的字节。eg:接收端收到了字节0~3和5~9的报文段,此时接收方会将确认号置为4,来表示我下一个想要收到的报文段要从第4个字节开始。
③重传
超时和冗余ACK会导致TCP对报文重传。
(1)超时
TCP为每个发送的报文段设置一个计时器,当设置重传时间到期还没收到确认,就会重传这一报文段。
但是重传时间也不是固定的,是根据上一个报文段从发出到确认的这一时间RTT,来动态地改变每次地重传时间,它会随着新测量RTT样本值得变化而变化。
当报文段丢失得时候,TCP也不能很快重传,这样会导致数据传输时延大。
(2)冗余ACK
由于超时重传时间周期太长,所以发送发可在超时事件发生之前通过注意冗余ACK来较好地检测丢包情形。
冗余ACK就是再次确认某个报文段的ACK(该报文段的确认发送端先前收到了)eg:发送端发送了序号为2、3、4、5的TCP报文段,其中4号报文段在链路中丢失了,无法到达接收方,后来2、4、5报文段都被接收了,4、5报文段成为了失序报文段,但是4、5报文段却并不是接收方期望收到的下一个报文(TCP规定每当比期望序号大的失序报文段到达时,会发送一个冗余ACK),于是接收方就发送了3个对2号报文段的冗余ACK,表示自己期望接收3号报文段(TCP规定发送方收到同一个报文段的3个冗余ACK时,就可以认为跟在这个确认报文段之后的报文段已经丢失了),发送方收到了对2号报文段的3个冗余ACK后,就可以认为3号报文段已经丢失,此时发送方立即对3号报文段执行重传。这种技术被称为快重传。
3.5 TCP流量控制
抑制发送方的发送速率,从而匹配发送方的发送速率与接收方的读取速率
TCP提供一种基于滑动窗口协议的流量控制机制
接收窗口rwnd:在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小(调整首部中“窗口”字段值,来限制发送方的发送速率)
拥塞窗口cwnd:发送方根据当前网络拥塞程度的估计而确定的窗口值
发送窗口上限=min[接收窗口,拥塞窗口]
传输层和数据链路层的流量控制的区别:
①传输层定义的是端到端的,而数据链路层定义的是两个中间的相邻结点的流量控制
②传输层的滑动协议窗口大小可以动态变化,而数据链路层不可以
3.6 TCP拥塞控制
防止过多的数据注入网络
对通信连接的端点来说,拥塞往往表现为通信时延的增加。
发送方在确定发送报文段的速率,既要根据接收方的接收能力,又要从全局考虑不要网络发生拥塞。因此TCP协议要求发送方要维护以下窗口:①接收窗口rwnd:反映接收方的容量,通过首部窗口字段通知发送方
②拥塞窗口cwnd:反映网络的当前容量。根据网络拥塞情况,动态调整。
发送窗口的上限值=min[rwnd,cwnd]
1.慢开始和拥塞避免
①慢开始算法---指数增长
刚开始cwnd=1(一个最大报文段长度MSS),
每收到一个新报文段的确认后(一个RTT后),cwnd=2*cwnd。
重复以上过程,直到cwnd涨到慢开始门限ssthresh(阈值)后,改为拥塞避免算法
②拥塞避免算法---线性增长
缓慢增长,即cwnd++;
根据cwnd大小执行不同的算法
- cwnd<ssthresh --->cwnd=2*cwnd
- cwnd>ssthresh--->cwnd++
- cwnd=ssthresh--->cwnd++或者2*cwnd
③网络拥塞的处理
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(未按时确认),就要把慢开始门限ssthresh设置为发送方的cwnd值的一半(不能小于2)
2.快重传和快恢复
分别对慢开始和拥塞避免的改进
①快重传
丢包之后的情形。
发送发连续收到三个重复的ACK报文,直接重传对方尚未收到的报文段,不必等待重传计时器。
②快恢复
原理:接收方丢包了,之后发送方收到连续三个冗余ACK(快重传),执行“乘法减小”算法,把慢开始门限设置为发送方cwnd的一半,然后令cwnd=慢开始门限值,之后cwnd++。
由于跳过了cwnd从1起始的慢开始过程,所以被称为快恢复。