在此之前先看一下什么是传输层?
我们在了解计算机基础时都知道 :
OSI有七层模型:
物理层, 数据链路层, 网络层,传输层, 会话层, 表示层, 应用层
TCP/IP 五层(或四层)模型
物理层 数据链路层 网络层 传输层 应用层
那什么是传输层呢?
负责数据能够从发送端传输接收端
UDP协议(在传输层):
16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;
如果校验和出错, 就会直接丢弃;
UDP的校验和:使用了CRC校验
取每个字节,把每个字节的数据依次循环相加,得到一个最终的数字,就是校验和。
接收端按照同样的规则再次计算校验和,和发送端的校验和进行对比。如果数据一致,就可以认为数据没有发生错误
UDP的特点:
(1)无连接 : 知道对端的IP和端口号就直接进行传输, 不需要建立连接(例如发短信,发出对方就收到)
(2)不可靠传输:没有确认机制, 没有重传机制; 若因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息。
(3)面向数据报 :发送一块数据就得读一块数据,发送和读写相对应
(4)全双工 :双向通信
基于UDP的应用层协议有:
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议
TCP:Transmission Control Protocol:传输控制协议
设计核心:1.可靠性:发送者能知道自己发送成功没成功
2.传输效率:可靠性的前提下尽量提高传输效率
一.确认应答
保证可靠性的核心机制
为了区分当前是应答哪个数据,需要引入序号和确认序号概念
序号:是给每个字节都编了个号
确认序号:表示的是当前序号之前的数据已经收到了,同时也意味着向发端索要当前确认序号开始的数据。
(32位序号:当前数据标号
32位确认序号:确认应答的标号)
二.超时重传: 也是可靠传输中的核心机制
传输一条数据没有确认应答的时候,等待一段时间,然后进行重传,重传可能会重复若干次,重复的次数越多,丢包的概率也就越小,重传的等待时间间隔也在依次变长
三.连接管理
6位标志位:
URG: 紧急指针是否有效
ACK: 确认号是否有效
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
<1>.三次握手建立连接:
(1)建立连接的意义:
1.双方各自试探对方看看对方是否合适和我建立连接。(试探双方的读写数据的能力)
2.双方可以在建立连接过程中协商一些必要的数据.(TCP的序号的基准值)
四处挥手断开连接
(2)三次握手的具体过程:
客户端先发起一个建立连接的请求(SYN 同步报文段)。服务器收到SYN后会立刻返回一个确认报文段ACK,同时回复的这个ACK也是一个SYN。客户端收到SYN后再返回一个ACK。
(3)涉及到的状态:
1.LISTEN状态:服务器端的状态,表示手机开机,信号良好,随时可以有人和你建立连接
2.ESTABLISHED状态:表示别人给你打电话,你接通了,建立就完成了,随时可以通信了.
<2>四次挥手断开连接:
1.CLOSE_WAIT:等待程序调用close来完成最终的断开连接过程
问:如果一个服务器上出现大量的CLOSE_WAIT是为啥?
答:就是代码里有bug,代码里的close忘记调了,或者没有执行到。
2.TIME_WAIT:虽然此时程序可能都已经结束了,但还是要保持连接TIME_WAIT状态一段时间,因为发送的最后一个ACK可能会丢包。
TIME_WAIT 等待时间是2MSL。
(注:MSL称为网络上两个主机之间数据传输的理论最大时间。在Centos7上默认60秒)
问:为什么是TIME_WAIT的时间是2MSL?
答:MSL是TCP报文的最大生存时间, 因此TIME_WAIT持续存在2MSL的话
就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);
同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN. 这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK)。
四.滑动窗口
窗口:不等待ACK的情况下批量发送多少数据
滑动:每次收到一个ACK之后,就依次发送下一条数据,等待ACK的数据区间就在往后移动。窗口越大,传输效率就越高
可靠性:如果窗口无限大,那么接收端可能处理不过来,网络环境也可能承载不了
问:如果滑动窗口过程中丢包了咋办?
答:如果是ACK丢了,不用管。确认序号表示的是当前序号之前的数据都收到了,后一个ACK就能涵盖前一个ACK的含义
如果是数据丢了,接收端就会反复尝试索要丢掉的数据,重复若干次后,发送端就会认为丢包,并重传对应的数据,而对于已经发送成功的数据,没必要重新传输一次。
五.流量控制:限制滑动窗口大小的一种机制
因为接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应.
因此引入流量控制机制:根据接收端的处理能力来进行限制。
具体过程:
(1)接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端;
(2)窗口大小字段越大, 说明网络的吞吐量越高;接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;发送端接受到这个窗口之后, 就会减慢自己的发送速度;
(3)如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端.
接受缓冲区(类似于生产者消费者模型)
六.拥塞控制:根据网络的拥堵情况,来限制发送端的发送速率
以试探式的方式:
刚开始的时候,使用比较小的滑动窗口。如果这个时候没有丢包,说明网络很畅通,增大滑动窗口。
如果发送丢包,说明网络可能拥堵了,减小滑动窗口。
发送端真实的滑动窗口大小=min(流量控制的窗口大小,拥塞窗口)
七.延迟应答 : 提高传输效率的方式
尽可能的提高窗口的大小
延时应答导致在延时时间中,接收端的程序已经处理了一部分的数据,此时ACK的窗口就更大了。
问:所有的包都可以延迟应答么?
答:不是。
数量限制: 每隔N个包就应答一次;
时间限制: 超过最大延迟时间就应答一次。
窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。
八.捎带应答
延迟应答的基础上,再提高传输效率
延迟应答的基础上,把应用程序发送的业务数据和系统发送的ACK数据合二为 一.
基于TCP应用层的协议:
HTTP,HTTPS,SSH,Telnet,FTP,SMTP;
TCP的特点:
(1)有连接
(2)可靠传输 例:发消息
(3)面向字节流 :可以一次发很多条,再读
(4)全双工 :双向通信
问题:
UDP如何实现可靠性传输?
答:传输层无法保证数据的可靠性传输,只能通过应用层实现。实现的方式可参照TCP可靠性传输的方式,只是它的实现不在传输层,而是在应用层。
引入序列号, 保证数据顺序;实现确认机制,超时重传机制,窗口确认机制。