传输层
一、介绍
这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。
第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。
传输层的任务是根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间,提供建立、维护和取消传输连接的功能,负责端到端的可靠数据传输。在这一层,信息传送的协议数据单元称为段或报文。
网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口。
有关网络层的重点:
-
传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;
-
包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议);
-
重要设备:网关。
TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。
UDP协议详解
UDP(User Datagram Protocol: 用户数据报协议),是一个非常简单的协议。
UDP协议的特点:
-
UDP是无连接协议;
-
UDP不能保证可靠的交付数据;
-
UDP是面向报文传输的;
-
UDP没有拥塞控制;
-
UDP首部开销很小。
UDP数据报结构:
首部:8B,四字段/2B【源端口 | 目的端口 | UDP长度 | 校验和】 数据字段:应用数据
TCP协议详解
TCP(Transmission Control Protocol: 传输控制协议),是计算机网络中非常复杂的一个协议。
TCP协议的功能:
-
对应用层报文进行分段和重组;
-
面向应用层实现复用与分解;
-
实现端到端的流量控制;
-
拥塞控制;
-
传输层寻址;
-
对收到的报文进行差错检测(首部和数据部分都检错);
-
实现进程间的端到端可靠数据传输控制。
TCP协议的特点:
-
TCP是面向连接的协议;
-
TCP是面向字节流的协议;
-
TCP的一个连接有两端,即点对点通信;
-
TCP提供可靠的传输服务;
-
TCP协议提供全双工通信(每条TCP连接只能一对一);
TCP报文段结构:
最大报文段长度:报文段中封装的应用层数据的最大长度。
TCP首部:
-
序号字段:TCP的序号是对每个应用层数据的每个字节进行编号
-
确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到。用ack_seq标识;
-
TCP段的首部长度最短是20B ,最长为60字节。但是长度必须为4B的整数倍
TCP标记的作用:
可靠传输的基本原理
基本原理:
-
不可靠传输信道在数据传输中可能发生的情况:比特差错、乱序、重传、丢失
-
基于不可靠信道实现可靠数据传输采取的措施:
差错检测:利用编码实现数据包传输过程中的比特差错检测 确认:接收方向发送方反馈接收状态 重传:发送方重新发送接收方没有正确接收的数据 序号:确保数据按序提交 计时器:解决数据丢失问题;
停止等待协议:是最简单的可靠传输协议,但是该协议对信道的利用率不高。
连续ARQ(Automatic Repeat reQuest:自动重传请求)协议:滑动窗口+累计确认,大幅提高了信道的利用率。
TCP协议的可靠传输
基于连续ARQ协议,在某些情况下,重传的效率并不高,会重复传输部分已经成功接收的字节。
TCP协议的流量控制
流量控制:让发送方发送速率不要太快,TCP协议使用滑动窗口实现流量控制。
TCP协议的拥塞控制
拥塞控制与流量控制的区别:流量控制考虑点对点的通信量的控制,而拥塞控制考虑整个网络,是全局性的考虑。拥塞控制的方法:慢启动算法+拥塞避免算法。
慢开始和拥塞避免:
-
【慢开始】拥塞窗口从1指数增长;
-
到达阈值时进入【拥塞避免】,变成+1增长;
-
【超时】,阈值变为当前cwnd的一半(不能<2);
-
再从【慢开始】,拥塞窗口从1指数增长。
快重传和快恢复:
-
发送方连续收到3个冗余ACK,执行【快重传】,不必等计时器超时;
-
执行【快恢复】,阈值变为当前cwnd的一半(不能<2),并从此新的ssthresh点进入【拥塞避免】。
TCP连接的三次握手(重要)
TCP三次握手使用指令:
面试常客:为什么需要三次握手?
-
第一次握手:客户发送请求,此时服务器知道客户能发;
-
第二次握手:服务器发送确认,此时客户知道服务器能发能收;
-
第三次握手:客户发送确认,此时服务器知道客户能收。
建立连接(三次握手):
第一次:客户向服务器发送连接请求段,建立连接请求控制段(SYN=1),表示传输的报文段的第一个数据字节的序列号是x,此序列号代表整个报文段的序号(seq=x);客户端进入 SYN_SEND (同步发送状态);
第二次:服务器发回确认报文段,同意建立新连接的确认段(SYN=1),确认序号字段有效(ACK=1),服务器告诉客户端报文段序号是y(seq=y),表示服务器已经收到客户端序号为x的报文段,准备接受客户端序列号为x+1的报文段(ack_seq=x+1);服务器由LISTEN进入SYN_RCVD (同步收到状态);
第三次:客户对服务器的同一连接进行确认.确认序号字段有效(ACK=1),客户此次的报文段的序列号是x+1(seq=x+1),客户期望接受服务器序列号为y+1的报文段(ack_seq=y+1);当客户发送ack时,客户端进入ESTABLISHED 状态;当服务收到客户发送的ack后,也进入ESTABLISHED状态;第三次握手可携带数据;
TCP连接的四次挥手(重要)
释放连接(四次挥手)
第一次:客户向服务器发送释放连接报文段,发送端数据发送完毕,请求释放连接(FIN=1),传输的第一个数据字节的序号是x(seq=x);客户端状态由ESTABLISHED进入FIN_WAIT_1(终止等待1状态);
第二次:服务器向客户发送确认段,确认字号段有效(ACK=1),服务器传输的数据序号是y(seq=y),服务器期望接收客户数据序号为x+1(ack_seq=x+1);服务器状态由ESTABLISHED进入CLOSE_WAIT(关闭等待);客户端收到ACK段后,由FIN_WAIT_1进入FIN_WAIT_2;
第三次:服务器向客户发送释放连接报文段,请求释放连接(FIN=1),确认字号段有效(ACK=1),表示服务器期望接收客户数据序号为x+1(ack_seq=x+1);表示自己传输的第一个字节序号是y+1(seq=y+1);服务器状态由CLOSE_WAIT 进入 LAST_ACK (最后确认状态);
第四次:客户向服务器发送确认段,确认字号段有效(ACK=1),表示客户传输的数据序号是x+1(seq=x+1),表示客户期望接收服务器数据序号为y+1+1(ack_seq=y+1+1);客户端状态由FIN_WAIT_2进入TIME_WAIT,等待2MSL时间,进入CLOSED状态;服务器在收到最后一次ACK后,由LAST_ACK进入CLOSED;
为什么需要等待2MSL?
-
最后一个报文没有确认;
-
确保发送方的ACK可以到达接收方;
-
2MSL时间内没有收到,则接收方会重发;
-
确保当前连接的所有报文都已经过期。