目录
1.传输层概述
1.1.传输层的功能
1.2.传输层的寻址和端口
2.UDP
3.TCP
3.1.TCP协议特点
3.2.TCP报文格式
3.3.TCP连接管理(三次握手,四次挥手)
3.3.1.TCP连接的建立(三次握手)
3.3.2.TCP连接的释放(四次挥手)
3.4.TCP可靠传输
3.5.TCP流量控制
3.6.拥塞控制
1.提供进程和进程间的通信(网络层提供的是主机和主机间的通信)
2.复用和分用
复用:多个进程可以使用同一个传输层协议传输数据
分用:接收方的传输层在收到数据后,将其分离,并送给相应的进程
3.差错检测,检查首部和数据部分(网络层仅检查首部)
4.TCP(面向连接,可靠)和UDP(无连接,不可靠)
1.端口:标识主机中的进程(软件端口,区别于路由器和交换机之类的硬件端口)
2.端口号只有本地意义(不同主机端口号无联系)
熟知端口号:0 ~ 1023。
应用程序 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | SNMP |
熟知端口号 | 21 | 23 | 25 | 53 | 69 | 80 | 161 |
3.套接字(主机IP地址,端口号):唯一标识一个主机和它的一个进程
1.无连接,最大努力交付,即不可靠(由应用层保证可靠交付)
2.面向报文(应用层给UDP什么样的报文,UDP就传输什么样的报文(应用层报文作为UDP数据报的数据部分,加上UDP首部,形成IP数据报的数据部分)即一次发送一个完整报文)适合传输少量数据的网络应用
3.无拥塞控制,适合实时应用(要求恒定速率,拥塞直接丢弃)
4.UDP首部8B,TCP首部20B
5.UDP首部格式:
源端口号:可有可无。如果不要求回信,则可以全0
目的端口号:必须有
UDP长度:整个数据报的长度,即数据部分+UDP首部(8B)
UDP检验和:检测是否有错,有错直接丢弃
分用时,找不到目的端口号,直接丢弃,并向发送方返回ICMP端口不可达报文
1.面向连接,且该连接只能有两个端点(点对点连接)
2.提供可靠服务,即无差错、不丢失、不重复、按序到达(可靠有序,不丢不重)
3.提供全双工通信(发送方和接收方可以互换),因此,需要建立发送缓存和接收缓存
发送缓存:①准备发送的数据②已经发送但未收到确认的数据
接收缓存:①按序到达但是未被应用读取的数据②未按序收到的数据
4.TCP面向字节(将应用程序交付的数据仅视为一段无结构的字节流)
1.源端口和目的端口:端口号占用16bit
2.序号:本报文段发送数据的第一个字节的序号
3.确认号ack:期望收到对方的下一个报文段的第一个数据字节的序号。若为N,则说明前N-1的数据都已经正确收到
4.数据偏移(首部长度):TCP报文段的数据部分距离TCP报文段的起始处的距离(即TCP报文段的首部长度),以4B为单位
5.紧急位URG:当URG = 1时,说明该报文段中的数据是紧急数据,需要从发送方缓存中优先发送(不需要在缓存中排队)(配合紧急指针)(URG针对发送方,PSH针对接收方)
6.确认位ACK:当ACK = 1 时,确认号有效。当建立连接后,所有报文的ACK都必须为1
7.推送位PSH:当PSH = 1时,则说明该报文需要尽快从接收方缓存中交付应用层(URG针对发送方,PSH针对接收方)
8.复位RST
9.同步位SYN:当SYN = 1 时,表明是连接请求/连接接受报文
10.终止位FIN:当FIN = 1时,表明发送方数据已发送完,要求释放连接
11.窗口:接收窗口大小,即现在允许对方发送的数据量
1.TCP连接传输三个阶段:连接建立→数据传送→连接释放
2.采用客户/服务器方式
发起连接建立为客户,被动等待连接为服务器
①当大写ACK = 1时,(控制字段)就必须有小写ack(确认号),即ack此时有效
1.客户端发送连接请求报文段,进入SYN-SENT状态,无应用层数据,但也要消耗一个序号
SYN = 1:表示这是连接请求报文
seq = x:序号,第一次发送报文,随机选取
ACK = 0:此时,客户端和服务器并没有建立连接
ack = 0:此时,客户端没有收到服务器发来的数据,因此,并不知道自己期待什么数据
2.服务器为TCP分配缓存和变量(TCP连接中双方都需要设置接收缓存和发送缓存),并为客户端返回确认报文,允许连接,进入SYN-RCVD状态,无应用层数据,但也要消耗一个序号
SYN = 1:表示这是连接接收报文
seq = y:序号,第一次发送报文,随机选取
ACK = 1:表示当前客户端和服务器建立连接
ack = x + 1:表示正确收到客户端发送的seq = x的数据,期待收到客户端发送第一个字节为x + 1的数据
3.客户端为TCP分配缓存和变量,并未服务器返回确认的确认,此时可以携带数据
SYN = 0:并不是连接发送/连接请求报文,以后的SYN都为0
seq = x + 1:向服务器发送第一个字节为x + 1的数据
ACK = 1:表示连接已经建立,以后的ACK都为1
ack = y + 1:表示正确收到服务器发送的seq = y的数据,期待收到客户端发送第一个字节为y + 1的数据
双方都可以随时终止连接
1.客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接,进入FIN-WAIT-1状态
FIN = 1:释放连接的控制信息,表示要求释放连接
seq = u:u为客户端上一个发送的数据的最后一个字节序号 + 1,可以不携带数据,但是也要消耗一个序号
2.服务器发送确认报文状态,此时客户端到服务器的单向连接释放(半关闭,客户端不能发数据,但是服务器可以),进入CLOSE-WAIT状态
ACK = 1:此时,仍然存在这连接
seq = v:v为服务器上一个发送的数据的最后一个字节序号 + 1
ack = u + 1:表示正确收到客户端发送的seq = u的数据,期待收到客户端发送第一个字节为u + 1的数据(但客户端无须回复)
3.服务器发完数据,就发出连接释放报文段,主动关闭TCP连接,进入LAST-ACK状态
FIN = 1:释放连接的控制信息,表示要求释放连接
ACK = 1:此时,仍然存在这连接
ack = u + 1:客户端在第二次挥手到第三次挥手间并没有给服务器发送数据,因此还是u + 1
seq = w:可能在第二次挥手到第三次挥手间服务器又发送了些许数据
4.客户端回送一个确认报文段,进入TIME-WAIT状态,并且需要等待2MSL(最长报文段寿命后),才能释放连接(防止确认报文段丢失),进入CLOSE状态
ACK = 1:此时,仍然存在这连接
seq = u + 1:需要消耗一个序号
ack = w + 1:表示收到接收方的前w个数据
1.校验:跟UDP校验一样,添加伪首部
2.序号:TCP为传输的每一个字节都编上一个序号
序号字段:本报文段发送的数据的第一个字节的序号
3.确认:采用累计确认或者捎带确认
接收时候若能按序接收,则返回的确认是期待接收的下一个字节
接收时若未能按序接收,则返回的确认是数据流中第一个丢失字节为止的字节
4.①超时重传:TCP发送方在规定时间内若没有收到接收方发回的确认则重传已发送的报文段
规定时间:TCP采用自适应算法,它的RTT会随着之前的报文的RTT变化产生新的RTTS
②冗余ACK:解决超时重传需要等待过久的问题
TCP规定每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。若发送方接收到对同一个报文段的3个冗余ACK时,就判定该报文段丢失,立即重传该报文段
例如:
发送方发送1、2、3、4、5,但是2在传输过程中丢失
接收方接收到1:返回1的确认(表示期望接收序号为2的数据)
接收方接收到3:失序接收,仍返回1的确认(表示期望接收序号为2的数据)
接收方接收到4:失序接收,仍返回1的确认(表示期望接收序号为2的数据)
接收方接收到5:失序接收,仍返回1的确认(表示期望接收序号为2的数据)
发送方收到3个对报文段1的冗余确认(收到的第一个对报文段1的确认不是冗余确认),判定报文段2丢失,立即重传报文段2
1.接收方根据在自己接收缓存的大小,动态的调整发送方的发送窗口大小
2.发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值
3.设A给B发数据,B仅回确认报文,初始时B的接收窗口rwnd为400B
①A发送序号为1 - 100的数据共100B,B的接收窗口大小为400 - 100 = 300B
②A发送序号为101 - 200的数据共100B,B的接收窗口大小为300 - 100 = 200B
③A发送序号为201 - 300的数据共100B,但传输过程中丢失
④B发送确认报文(只有ACK = 1的时候,ack才有效),确认按序收到前200B的数据,并更改接收窗口为300B
⑤A发送序号为301 - 400的数据共100B,B的接收窗口大小为300 - 100 = 200B(虽然未能按序接收,但是接受数据前,B的接收窗口为300B,参考数据链路层的选择重传协议SR,可以先将该失序数据放到接收缓存,等待按序数据的到来后,采用累加确认的方式对数据进行确认)
⑥A发送序号为401 - 500的数据共100B,B的接收窗口大小为200 - 100 = 100B
⑥A此时仍未收到B对序号为201 - 300的数据的确认帧,判定该数据丢失,重新传输。A发送序号为201 - 300的数据共100B,B的接收窗口大小为100 - 100 = 0B(此时,B原本接收的序号为301 - 500的失序数据数据加上现在接收的201 - 300的数据,组合而成按序接收的201 - 500的数据)
⑦B发送确认报文,确认按序收到前500B的数据,并更改接收窗口为100B
⑧A发送序号为501 - 600的数据共100B,B的接收窗口大小为100 - 100 = 0B
⑨B发送确认报文,确认按序收到前600B的数据,并更改接收窗口为0B
⑩当接收窗口为0B时,A就会每隔一段时间向B发送查询当前B的接收窗口的报文,B收到该报文后,就会向A返回一个当前接收窗口大小的报文。若不为0,则继续传输;若仍未0,则继续等待一个间隔后重复操作
1.拥塞控制是防止过多的数据注入网络,保证网络中的路由器不过载
2.流量控制是端对端,即接收端控制发送端
拥塞控制是针对全局,即网络中的每一个路由器,每一个主机
3.接收窗口:接收方根据接收缓存设置,反应接收方的容量
拥塞窗口:发送方根据当前网络拥塞情况设置,反应网络当前的容量
发送窗口为接收窗口和拥塞窗口的最小值
4.拥塞控制四种算法:
发送端收到接收端返回的确认报文时,拥塞窗口变化
①慢开始和拥塞避免:
1.慢开始:指的是拥塞窗口从1开始(试探网络拥塞情况),在经历一个RTT后,拥塞窗口加倍(线性增长),直到达到慢开始的阈值时,改用拥塞避免
2.拥塞避免:经历一个RTT后,拥塞窗口+1(加法增长)。直到发生网络拥塞后,拥塞窗口重新变回1,更改慢开始阈值为此时拥塞窗口的一半,并重新改用慢开始算法
3.拥塞窗口 < 阈值:慢开始
拥塞窗口 = 阈值:慢开始或者拥塞避免
拥塞窗口 > 阈值:拥塞避免
②快开始和快恢复:
1.在网络发生拥塞前,采用慢开始和拥塞避免
2.快重传:冗余ACK。当收到三个对同一序号的ACK报文时,直接重传该报文,无须等待超时重传
3.快恢复:当发生快重传后,拥塞窗口变为当前拥塞窗口的一半(预防发生拥塞)(区别于采用之前采用慢开始和拥塞避免情况下,拥塞窗口变为1),之后采用拥塞避免,每经历一个RTT,拥塞窗口+1(加法增加)
③TCP连接建立和网络出现超时,采用慢开始和拥塞避免
当发送方收到冗余ACK时,采用快重传和快恢复