计算机网络体系结构中的物理层、数据链路层、网络层 共同解决了将主机通过【异构网络互联】所面临的问题,实现了主机到主机的通信;
但实际上在计算机网络中进行通信的实体是位于两端主机中的进程!
为【运行在不同主机】的进程提供的逻辑通信服务,运输层协议又称端到端协议 ;
运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑,路由选择协议等),看上去是端到端的逻辑通信 ;
TCP/IP体系的运输层使用端口号来区分不同的应用进程;
端口号使用16比特,取值范围0~65535 (2^16);
熟知端口号: FTP使用21/20,HTTP使用80,DNS使用53,DHCP 67/68
注意:
端口号只具有本地意义!不同计算机的端口号之间没有联系
功能1: 为运行在【不同主机上】的进程之间提供了逻辑通信;
功能2: 复用和分用
复用(从上到下):不管是UDP封装成的UDP数据报还TCP协议封装成的TCP报文段,在【网络层】都需要使用IP协议封装成IP数据报!
分用(从下到上):接收方收到IP数据报进行IP分用,若协议字段为17则将数据载荷部分交给运输层的UDP,6则交给TCP ;剥离数据报的头部根据端口号将数据传到对应的进程 ;
UDP首部格:
UDP首部仅8个字节,由于不提供可靠传输,仅在IP数据报的基础上增加了端口号、长度、校验和;
TCP首部格:
TCP要实现可靠传输、流量控制、拥塞控制等服务最小长度为20字节,最大60字节
实现方式: TCP的流量控制通过滑动窗口机制来实现,数据接收端可根据自己的接收缓存情况,随时动态地调整rwnd ,以使发送方调整传输窗口大小;
注意:
过程:
假设A要向B发送数据,【主机建立TCP连接时】,B告诉A接收窗口rwnd 的大小假设为300
假设A发送的每个TCP报文段可携带100个字节数据,每个小格子是100个字节数据的序号
A向B 将窗口内的数据封装成报文段 发送(在发送数据后,便立刻创建一个该报文段的重传计时器),凡是没有收到确认的数据都会保留在发送缓存,以便在超时重传时使用
B会对接收到的报文段进行累计确认,返回确认报文段,确认位ACK=1(在建立连接后ACK都为1),ack=201(确认号为接收方期待发送方发送的下一个报文数据的第一个字节的序号), B根据缓存大小返回 rwnd接收窗口大小=300,
A收到B发送的确认报文段:
① A会将窗口调整为300,
② 并删除【发生缓存中】已经被确认的数据报 ,
③ 则撤销已被确认的报文的重传计时器
假设A发送的数据报中途丢失,该报文段的重传计时器超时后,则A重发报文段,直到B返回确认报文段;
实现: TCP的可靠传输也是通过以字节为单位的滑动窗口来实现;
即发送方在构造字节的发送窗口时,仅考虑接收方的接收窗口rwnd,(假设不考虑拥塞窗口);
注意:
1.链路层的滑动窗口大小一般是固定的,在传输中不会改变,而TCP可靠传输使用的滑动窗口会根据接收方发送的接受窗口大小和拥塞窗口大小动态调整;
2.接收方只对按序到达的数据中的最高序号给出确认;
过程:
发送方:
接收方:
只对按序到达的报文段的最高序号给出确认;
其他保证可靠传输的机制:
1.报文段的超时重传
2.流量控制
3.拥塞控制
4.TCP首部的校验和字段
拥塞: 若对网络中某一个资源的需求超过了该资源所能提供的可用部分,网络性能就要降低。
轻度拥塞状态: 网络的吞吐量明显小于理想的吞吐量时
进入拥塞状态: 若出现拥塞而不控制,整个网络的吞吐量将随输入负荷的增大而下降 ↓
死锁: 吞吐量为0时,网络将无法工作
实现方式: 发送方(主动)维护一个cwnd 拥塞窗口,窗口大小随网络的拥塞程度动态变化;
区别rwnd由接收方发给发送方,发送方是被动的;
90年之前:慢开始算法+避免拥塞算法
拥塞控制过程: (拥塞窗口cwnd会随网络拥塞程度,以及拥塞控制算法而动态变化)
90年之后:快重传+会恢复(针对报文丢失)
快重传算法:
原因: 有时个别报文段丢失,而网络并没有发生拥塞,这将导致发送方超时重传,并误认为发生了网络拥塞,因而降低传输效率
采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失
概念: 快重传就是使发送方尽快重传,而不是等重传计时器超时再重传
实现:
发送方要立即对报文段进行确认
收到不按序到达的报文段时,要发出对已收到报文段的重复确认,
一旦接收方收到3个连续的重复确认,在【重传计时器超时之前】立即重传接收方接收的报文段的下一个报文段!以避免因为超时重传而误认为是网络拥塞;
快重传控制过程:
快恢复算法:
一旦发送方收到3个连续的重复确认,就知道是丢失了个别报文段而不是拥塞,就可以执行快恢复算法:
①发送方将慢开始门限值ssthresh和拥塞窗口cwnd都调整为当前窗口的一半,
②然后执行避免拥塞算法,即cwnd线性增加;
由于跳过了慢开始算法直接执行拥塞避免算法,所以叫快恢复;
TCP在发送数据时,是将发送缓存取出一部分或全部字节,添加一个首部使之成为TCP报文段后进行发送。
一个TCP报文段同样由首部和数据载荷两部分构成;
首部字段:
确认号ack:期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前手打收到的所有数据的确认
只有ACK=1时,ack才有效
ACK=0时,ack无效
窗口字段:rwnd窗口值作为接收方让发送方设置其发送窗口的一句
校验和:用来检查范围包括TCP报文段的首部和数据载荷两部分
确认位ACK:TCP规定,在建立连接后所有传送的TCP报文段的ACK=1
同步位SYN:连接请求和连接请求的确认时,SYN=1
终止位FIN:用来是释放一个连接
复位标志位RST:表示TCP连接出现了严重差错,必须释放连接,再重新连接
推送位PSH:接收方的TCP收到PSH=1的报文段会尽快上交应用进程(接收方发送)
紧急位URG:URG=1时,接收方收到后立即上传紧急数据(发送方发送)
填充字段:确保首部能被4整除;