功能
传输层提供进程到进程的逻辑通信
复用和分用
传输层对收到的报文进行差错检测
TCP/UDP
提供进程到进程的逻辑通信
网络层是提供主机间逻辑通信
从网络层来看,通信双方为两台主机,IP数据包首部给出两台主机的IP地址
而实际上的两台主机通信时两台主机内的应用进程进行通信,应用进程间的通信也称端到端的逻辑通信
复用和分用
复用是指发送方不同的应用进程都可使用同一个传输层协议传送数据
分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程
差错检验
网络层只检查IP数据报的首部,不检验数据部分是否出错,而传输层两个都检验
传输协议
提供两种不同的传输协议,即面向连接的TCP和无连接的UDP
寻址与端口
端口的作用
- 端口使得应用层各种应用进程将数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程
- 端口是传输层服务访问点TSAP,它在传输层的作用类似 IP地址在网络层中或 MAC地址在数据链路层的作用,只是端口标识进程,IP和MAC表示主机
- 数据链路层的SAP是MAC地址,网络层的SAP是IP地址
- 硬件端口指的是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与传输实体间进行层间交互的地址
- 传输层和协议栈层间的抽象的协议端口是软件端口
端口分类
复用、分用
端口只有本地意义
端口号按范围分为服务端使用的端口号和客户端使用的端口号
套接字
Socket = (主机IP地址、端口号),使用套接字识别端点,标识主机及其某个进程
TCP/UDP
UDP
特点:
- 无连接,减少时延
- 尽最大努力交付,即不保证可靠交付
- UDP面向报文,适用于一次性传输少量数据的网络应用
- 无堵塞控制,实时性强
- UDP开销小
- 发送报文时一次性发送
由于无须建立连接,则没有建立连接的时延,强实时性,弱可靠性
UDP是无连接状态,不需要维护连接状态(接收和发送缓存、拥塞控制参数和序号与确认号的参数),因此支持更多活动客户机
分组首部开销小
TCP的首部为20B,UDP仅有8B
应用层控制发送数据和发送时间更方便
因为没有拥塞控制,应用要求稳定速度,容忍一定的数据丢失,避免大时延
UDP常用于一次性传输数据较少的网络应用
如DNS、SNMP等采用TCP则会因为连接产生开销
UDP常用于多媒体应用
UDP提供最大努力交付,应用可在应用层实现维护传输可靠性
UDP面向报文,对应用层交下来的报文添加首部就交付IP层
UDP首部格式
UDP校验
TCP
面向连接,点到点,提供可靠交付服务,无差错,提供全双工通信,面向字节流(TCP将程序提供的数据看成一连串的无结构的字节流)
TCP报文段首部格式
TCP传送的数据单元称为报文段,分为TCP首部和TCP数据两部分
首部固定20B大小,4NB字节为选项
TCP既可用于运载数据,也可用来建立连接、释放连接和应答
- 源端口和目的端口字段
- 序号字段:记录本报文发送的数据的第一个字节的序号
- 确认号字段:期望收到对方的下一个报文段的数据的第一个字节的序号,确认号为N则是表明N-1为止的所有数据都已正确收到
- 数据偏移:与IP数据报分片的数据偏移进行区别,表示的是首部长度
- 保留字段
- 紧急位URG:URG=1表明紧急指针字段有效,提示系统报文段中有紧急数据需尽快传送,URG需要和紧急指针配合使用,指定数据从第一个字节到紧急指针所指的字节就是紧急数据
- 确认位ACK:当ACK=1时生效,建立连接后必须将ACK设为1
- 推送位PSH:PSH=1时,需要尽快地交付给接收进程,而不是等待缓存填满后再向上交付
- 复位位RST:RST=1时,表明TCP连接出现差错,需要释放连接,重建连接
- 同步位SYN:SYN=1表示这是个连接请求或连接接收报文,SYN=1,ACK=0表明这是一个连接请求报文,若同意请求则发送响应报文 SYN =1, ACK =1
- 终止位FIN:释放连接,FIN=1表明报文段的发送方的数据已发送完毕,并要求释放传输连接
- 窗口字段:表明允许发送的数据量
- 校验和:与UDP相同,计算时加入伪首部
- 紧急指针字段:指出紧急数据共有多少字节,位于报文段数据最前面
- 选项字段:窗口扩大,数据段最大长度,时间戳等
- 填充字段:使得首部长度为4B的整数倍,填充0
TCP连接管理
TCP连接的管理就是使运输连接的建立和释放都能正常进行
TCP需要解决三个问题:
要使双方能够确知对方的存在
要允许双方协商一些参数,对运输实体资源进行分配
三次握手
seq为序号字段,标明本次报文段数据部分的第一个字节的序号
ack是确认号字段,告诉对方,自己接下来接收的数据是从字节序号ack开始的数据
ACK是确认位,ACK 为1标明有效,为0则无效
SYN是同步位
第一步:C向S发送连接请求,此报文段不含应用层数据,首部SYN=1,seq =x,不携带数据,但消耗一个序号
第二步:S收到连接请求报文段时,若同意建立连接时则发回确认,并为该TCP连接分配TCP缓存和变量,在确认报文段中,SYN和ACK都为1,确认号为x+1,seq为y
第三步:当客户机收到确认报文段后,还要向服务器给出确认,同样要给该连接分配缓存和变量,报文ACK=1,seq=x+1,确认号字段ack=y+1,该报文段可携带数据,若不携带则不消耗序号
TCP是全双工通信,由于服务器资源在完成第二次握手时分配,客户端的资源在完成第三次握手时分配的,使得服务器容易收到SYN洪泛攻击
SYN洪泛攻击,攻击者发送多次SYN请求连接,服务器返回ACK后不应答,造成大量连接处于半连接状态,浪费资源
四次挥手
第一步:因为要关闭连接,因此发送FIN报文,FIN=1,seq=u,此为前面已经传送过的数据的最后一个字节序号+1,发送FIN报文后,仅仅关闭其中一条数据通路(TCP的全双工属性)
第二步:S收到FIN报文,ack=u+1,seq为v,同样是前面已经传送过的数据的最后一个字段序号+1,此时处于半关闭状态,即C到S的通路关闭,但S到C的通路还未关闭,因此S向C发送数据,C仍要接受
第三步:若S没有数据需要向C发送,则发送FIN报文段,通知C释放连接
第四步:S收到FIN报文时需要发出确认,ACK=1,ack=w+1,序号seq=u+1,等到过去2MSL后,S进入连接关闭状态
TCP可靠传输
TCP可靠在保证接收方进程从缓存区读出的字节流和发送方发出的字节流是完全一样的
机制分为:校验、序号、确认、重传
- 校验则是和UDP一样,增添伪首部计算校验和
- 序号字段:报文段的第一个字节的序号
- 确认:报文段首部确认号字段告诉已经正确接收数据,并请发以确认号字段为n开始的数据报字段,当接收到的数据不是按序号接收,接收方会将其放在缓存区,并同时发送确认报文段,此时指定确认号字段为需要的序号
- 重传:TCP发送方在规定时间内没收到确认就要重传报文段,超时重传才是自适应算法,动态改变重传时间RTTS
TCP流量控制
接收方根据换出缓存大小,动态调整发送方的发送窗口大小,称为接收窗口rwnd,调整TCP报文段首部中的窗口字段值
发送方有一样的机制拥塞窗口cwnd
由上图可知每次确认报文,都会带有rwnd字段,通知窗口大小
当收到零窗口通知就会开启持续计时器,当持续计时器时间到期,就会发送一个零窗口探测报文段,若窗口仍为0则重设持续计时器
传输层定义端到端用户之间的流量控制,数据链路层定义两个中间的相邻结点的流量控制。
另外,数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层的则可以动态变化。
拥塞控制
阻止过多的数据注入网络,保证路由器或链路不过载
拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。
拥塞控制算法
单向传送数据,另一个方式只传送确认
发送窗口 = Min(接受窗口,拥塞窗口)
接收窗口欧由接收方确定,发送方根据估算的网络拥塞程度而设置的窗口值,反映网络当前容量
慢开始-拥塞避免
慢开始:拥塞窗口从1开始,每收到一个报文的确认就将cwnd+1,每经过一个传输轮次,拥塞窗口指数规律增长,等到增长到规定慢开始门限ssthresh阈值,改用拥塞避免
拥塞避免的增长规律则是每经过一个往返实现就+1,改为线性规律增长
每当发送一次拥塞,就令慢开始满开始门槛ssthresh成为当前cwnd的一半
cwnd<ssthresh时,使用慢开始
cwnd>ssthresh时,改用拥塞避免
cwnd=ssthresh时,两种都可以
网络出现拥塞时,只要发送超时事件:未按时收到确认、重传计时器超时等,ssthresh都要设置为拥塞时cwnd值的一半,但大于等于2
乘法减小:不分阶段,慢开始门槛都是拥塞窗口值的一半,减少注入网络的分组数
加法增大:拥塞避免执行后,cwnd在每轮RTT后+1,增长缓慢
快重传-快恢复
针对慢开始和拥塞避免的改进
快重传:通过冗余ACK来检测丢包的发生和网络拥塞的检测
当发送方连续收到三个重复ACK报文,直接重传,无视重传计时器
快恢复:收到连续三个冗余ACK后执行乘法减小算法,设置ssthresh为cwnd一半,与慢开始不一样,cwnd为ssthresh的新值,执行拥塞避免算法,而慢开始则是cwnd为1
流量控制,发送方数据量由接收方决定
拥塞控制,发送方通过检测网络状况来决定
发送方检测到超时时,采用慢开始和拥塞避免
发送方接收到冗余ACK时,采用快重传和快恢复
因此发送窗口由流量控制和拥塞控制共同决定,发送窗口取值Min(接收端窗口,拥塞窗口)