第四层 运输层
TCP协议和UDP协议:提供进程之间的逻辑通信
面向连接的TCP协议和无连接的UDP协议
TCP传输的数据叫做TCP数据报
UDP传输的数据叫做UDP数据报或者用户数据报
UDP:不可靠通信(在传输数据之前不需要建立连接,对方的运输层收到UDP报文之后也不好给出任何确认,所以是不可靠的交付,即无连接,无确认,不可靠,但是简单和快,虽然不提供可靠交付,但在某些情况下是一种有效的工作方式,视频:保证流畅,质量其次)
TCP:可靠通信(提供面向连接的服务,TCP不提供广播或者多播服务,全双工通信)
IP地址+端口(16比特)=套接字(插口:socket)
UDP协议:
1. UDP是无连接的
2. UDP是无确认收到回复的
3. UDP不可靠的(尽最大努力交付)
4. UDP是面向报文的(向下不兼容,UDP数据报+IP首部=IP数据报)
5. 没有拥塞控制
6. 支持1v1,1v多,多v多的交互通信(交互:半双工)
7. UDP的首部开销小(8个字节)
UDP数据报的组成:
伪首部:为校验和服务(扩展知识)
源端口
目的端口
长度:UDP数据报的长度
校验和:
TCP协议:
TCP发送/接收缓存:为了保证TCP的全双工通信
TCP的特点:
1. TCP是面向连接的(逻辑连接)
2. TCP只提供点对点的通信(一次只能有一个进程通信)
3. TCP提供可靠的服务(有收到返回确认)
4. TCP提供全双工通信
5. 面向字节流(每次传输必须是多少字节,单位是字节,而不是位)
TCP连接的端点叫做套接字或者插口
保证TCP可靠传输的措施:(因为TCP发送的报文是交给IP层发送的,但IP层只能提供尽最大努力的服务,也就是说TCP下面网络所提供的是不可靠的传输)
1. 停止等待协议:每发送完一个分组,就等待对方确认,收到确认之后才再发送一个分组(简单,但是信道的利用率低)
2. 连续ARQ协议(滑动窗口协议):接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已经正确收到了(不对每个分组返回确认,只对收到的连续几个分组返回确认,这样返回确认的次数就变少了)
TCP报文的格式:首部(20字节+4n字节 n整数,可以为0)+数据部分
TCP报文组成:
源端口:
目的端口:
序号:该报文的第几个报文段,方便报文段重新组成一个完整的报文
确认号:接收方返回该确认号代表该报文段成功接收
数据偏移:可以将报文段还原成一个完整的报文(序号不可以确定该段数据有没有发生丢失,数据偏移是报文段重新组成一个完整报文的核心算法)
紧急比特URG:当URG=1,表明该报文段中有紧急数据,需要尽快发送
确认比特ACK:当ACK=1时,说明该报文是一个发送方返回的确认报文
推送比特PSH:接收到PSH=1的报文段,TCP接收缓存直接尽快交付给应用进程,而不要等到整个缓存都填满了才发送给应用进程
复位比特RST:当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后重新建立链接
同步比特SYN:当SYN=1,表示这是一个连接请求或者连接接收报文(协商报文,不是数据报文)
终止比特FIN:当FIN=1,表明此报文段的发送端发送完毕
窗口:一次发送或者接受数据量的上限,防止缓冲区溢出
校验和:校验
紧急指针:指出在本报文端中紧急数据的最后一部分(指定紧急数据的最后一部分量是多少)
选填字段:最大报文长度MSS,其他自己按照需要写
发送缓存用来暂时存放什么东西?
1.准备发送的数据
2.已经发送但尚未收到确认的数据
接收缓存用来暂时存放什么东西?
1. 按序到达的,但尚未被应用程序读取的数据
2. 没有按序到达的数据(比如第5块,第7块到达了,第6块没有到达)
发送窗口的大小和接受窗口的大小同一时刻也不一定一样大
TCP可靠传输的实现:
1. 以字节为单位的滑动窗口(不用每次接收到都发送一个接收确认信号,流量控制)
2. 超时重传机制(加权平均往返时间,一直在变,保证不过大也不过小)
3. 连续确认SACK(1-10收到了,15-20收到了,11-14没有收到,但是TCP就是要你重发14-20的)
TCP的流量控制:(让发送方不要发太快,要让接收方来得及接受,同时避免网络堵塞)
1. 利用滑动窗口实现流量控制:在合适的时候调节滑动窗口的大小
2. 必须考虑传输效率
对发送方:Nagle算法(扩展知识)
对接收方:糊涂窗口综合症(扩展知识)
流量控制是防止发送拥塞,拥塞控制是产生了拥塞的处理办法
TCP的拥塞控制:
几种拥塞控制的方法:
1. 慢开始和拥塞避免【乘法减小(*0.5)加法增大(缓慢增加)】
2. 快重传和快恢复
快重传:发送端只要一连收到三个重复的ACK即可断定有分组丢失了,应理解重传丢失的报文段而不必继续等待为该报文段设置的重传计时器的超时(快重传并非取消重传计时器,而是在某些情况下更早的重传丢失的报文段)
快恢复:根据收到的重复ACK的多少调节慢开始门限ssthresh
3. 随机早期检测RED
TCP的运输连接管理:
三个阶段:连接建立,数据传输,连接释放
连接建立过程需要解决的问题:
1. 要使每一方能够知道对方的存在
2. 要允许双方协商一些参数(如最大段长度,最大窗口大小,服务质量)
3. 能够对运输实体资源进行分配(如缓存大小)
TCP的连接和建立都是采用客户服务器方式
主动发起连接的叫客户
被动接收连接的叫服务器
三次握手建立TCP连接:
第一次握手:客户:发送序号=200,标志位SYN=1
第二次握手(建立接收缓冲区):服务器:发送序号=500,确认序号=200+1,标志位SYN=1,ACK=1
第三次握手(建立接收缓冲区):客户:发送序号=201,确认序号=501,标志位ACK=1
要发送的发送序号=上一次接收到的确认序号
要发送的确认序号=上一次的发送序号+1
TCP的连接释放:四次挥手
第一次挥手:客户:发送序号=200,标志位FIN=1
第二次挥手(释放接收缓冲区):服务器:发送序号=500,确认序号=200+1,标志位ACK=1
第三次挥手(释放发送缓冲区):服务器:发送序号=300,确认序号=200+1,标志位FIN=1,ACK=1
第四次挥手:客户:发送序号=200+1,确认序号:300+1,标志位ACK=1
为什么TCP协议终止连接需要四次?
1. 当客户A确认发送完数据且知道B已经接收完了,想要关闭发送数据口,就会发FIN给服务器B
2. 服务器B收到客户A发送的FIN,就会发送ACK回复
3. 但这时服务器B可能还在发送数据(全双工),没有想关闭数据口的意思,所有FIN于ACL不是同时发送的,而是等待服务器B数据发送完了,才会发送FIN给客户A
4. 客户A收到服务器B发来的FIN,知道B的数据也发送完了,回复ACK,客户A等待2MSL之后,没有收到服务器B传来的任何信息,知道服务器B已经收到了自己的ACK,客户A就关闭连接,服务器B也关闭连接