写在前面:这一系列文章是对计算机网络相关知识点整理的笔记,基本都是参考文章里的原话,做了整合,只是方便自己去看去复习,如果可以,希望朋友们点进参考的文章里仔细阅读,感谢大家!
- 传输层提供不同主机上的进程之间的逻辑通信(端到端),即使在不可靠的网络层(主机之间的逻辑通信)传输下,传输层也能提供可靠的传输。
- 传输层的协议:TCP、UDP
- 传输层的功能:提供了端到端的可靠的传输服务。
- 几个重要的端口号:
一、TCP协议
1. TCP消息头
固定部分20个字节,可选部分40个字节,最多60个字节。
typedef struct _TCP_HEADER
{
short m_sSourPort; // 源端口号16bit
short m_sDestPort; // 目的端口号16bit
unsigned int m_uiSequNum; // 序列号32bit
unsigned int m_uiAcknowledgeNum; // 确认号32bit
short m_sHeaderLenAndFlag; // 前4位:TCP头长度;中6位:保留;后6位:标志位
short m_sWindowSize; // 窗口大小16bit
short m_sCheckSum; // 检验和16bit
short m_surgentPointer; // 紧急数据偏移量16bit
}attribute((packed))TCP_HEADER, *PTCP_HEADER;
1. 源端口号:16位,2个字节。
2. 目标端口号:16位,2个字节。
3. 序列号seq: 32位,4个字节。用来标识 从TCP发送端向TCP接收端发送的数据字节流。(后面三次握手四次挥手会用到)
4. 确认号ack:32位,4个字节。确认端期望接收到的,下一个序号(上次已成功收到数据字节序号加1)。只有ACK设置为1才有效。(后面三次握手四次挥手会用到)
5.
(1)TCP头部长度字段:4位。一般称为数据偏移。指出头部占几个占32比特(4B)。(最大为15,所以TCP头最长为15*4B = 60B)或者说TCP报文段的数据部分,距离TCP报文段的起始处有多远。
(2)中间保留6位。
(3)后6位标志位:
- URG:为1时,紧急指针有效
- ACK(确认报文段):为1时,确认号有效
- PSH:为1时,提醒接收方尽快将这个报文段交付应用层
- RST(复位报文段):为1时,要求重新建立连接
- SYN(同步报文段):为1时,请求建立一个连接
- FIN(结束报文段):为1时,通知对方,本端要关闭连接
6. 窗口大小字段:16位,2个字节。用于流量控制。表示本机期望的一次接受的字节数。
7. 校验和:16位,2个字节。发送方填充,接收方执行CRC算法(循环冗余校验),检验TCP报文段在传输过程中是否损坏。
8. 紧急指针:16位,2个字节。是一个偏移量,和序列号中的值相加,得到紧急数据的最后一个字节的序号。只有URG设置为1时才有效。
9. 选项字段:32位,4字节。可能包括窗口扩大因子、时间戳等等。
2. 三次握手
总图
(1)第一次握手:
- 客户端发送连接建立请求报文段,标志位SYN置为1,随机生成一个序列号seq,假设为x。
- 然后客户端进入SYN_SEND状态,等待服务器的确认。
(2)第二次握手:
- 服务器收到客户端发送的报文段,确认号ack置为x+1,标志位ACK置为1。同时随机生成一个序列号seq,假设是y,标志位SYN置为1。
- 发送这个报文段后, 服务器进入SYN_RECV状态。
(3)第三次握手:
- 客户端收到服务器发送的报文段,标志位ACK置为1,确认号ack为y+1。
- 发送报文段后,客户端和服务器都进入ESTABLISHED状态,完成三次握手,可以开始数据传输,
问:为什么是3次握手?
可以有效的防止已经失效的连接请求又传送到的服务器,产生错误。
比如:
客户端发送连接建立请求报文,但是由于网络拥塞,服务器没有收到。客户端没有收到ack,放弃建立连接或者重新发送。
一段时间之后,这个连接建立请求报文到达服务器,如果不采用三次握手而是两次的话,此时服务器发送ack报文,连接就建立了。但是客户端已经放弃建立连接,不会向服务器发送数据。服务器单向建立连接造成资源浪费。
3. 四次挥手
还是这张图
(1)第一次挥手:
- 假设上次主机1发送的报文段中seq是x+1,收到的报文段中seq是y。
- 主机1设置序列号seq为x+2,确认号ack为y+1;设置标志位ACK为1,标志位FIN为1.
- 主机1进入FIN_WAIT_1状态,表示主机1没有数据要发送给主机2.
(2)第二次挥手:
- 主机2收到主机1发送的报文段,回复一个确认报文段,序列号seq为y+1,确认号ack为x+3;
- 主机1进入FIN_WAIT_2状态
(3)第三次挥手:
- 主机2向主机1发送报文段,FIN置为1,请求关闭连接。
- 主机2进入CLOSE_WAIT状态。
(4)第四次挥手:
- 主机1收到主机2发送的报文段,向主机2发送确认报文段,然后主机1进入TIME_WAIT状态。
- 主机2收到后,关闭连接。
- 主机1等待2个MSL(报文段最大生命周期),如果没有收到报文段,则双方关闭连接
问:为什么是4次挥手
TCP是全双工模式,因此要断开连接需要分别断开主机1到主机2的连接、主机2到主机1的连接。
当主机1发出FIN报文段时,只表示主机1已经没有数据要发送了,但是可以接受主机2发送的数据。
当主机2返回ACK报文段时,表示主机2已经知道主机1没有数据发送。
当主机2发送FIN报文段时,表示主机2也没有数据要发送了。
当主机1返回ACK报文段后,等待两个最大报文生存周期(防止还有数据要传)关闭连接。
4. 可靠传输
- 通过序号、确认、重传保证可靠传输。
- 重传又分为超时和冗余ACK。冗余ACK是指 发送方收到对同一个报文段的3个冗余ACK,就可以认为这个报文段之后的报文段已经丢失。
5. 流量控制
- 类似数据链路层的 滑动窗口协议。
- 但是传输层的滑动窗口协议的窗口可以动态变化。
6. 拥塞控制(★)
拥塞控制的是一个全局性的过程,而流量控制室点对点通行量的控制。
慢开始和拥塞避免。快重传(快恢复)
慢开始:
假设当前发送方拥塞窗口cwnd的值为1,而发送窗口swnd等于拥塞窗口cwnd,因此发送方当前只能发送一个数据报文段(拥塞窗口cwnd的值是几,就能发送几个数据报文段),接收方收到该数据报文段后,给发送方回复一个确认报文段,发送方收到该确认报文后,将拥塞窗口的值变为2。
发送方此时可以连续发送两个数据报文段,接收方收到该数据报文段后,给发送方一次发回2个确认报文段,发送方收到这两个确认报文后,将拥塞窗口的值加2变为4,发送方此时可连续发送4个报文段,接收方收到4个报文段后,给发送方依次回复4个确认报文,发送方收到确认报文后,将拥塞窗口加4,置为8,发送方此时可以连续发送8个数据报文段,接收方收到该8个数据报文段后,给发送方一次发回8个确认报文段,发送方收到这8个确认报文后,将拥塞窗口的值加8变为16,
当前的拥塞窗口cwnd的值已经等于慢开始门限值,之后改用拥塞避免算法。
拥塞避免算法:
每个传输轮次,拥塞窗口cwnd只能线性加一,而不是像慢开始算法时,每个传输轮次,拥塞窗口cwnd按指数增长。
快重传:
重传机制有两种,超时重传和冗余ACK。快重传是针对冗余ACK的方法。
二、UDP
1. UDP报头
头部8B,UDP校检是通过增加12B的伪首部来实现的
之后通过反码求和来进行差错校检
三、TCP和UDP的区别
- TCP是面向连接的,能保证数据的准确性和到达顺序;UDP是无连接的,可能出现丢包。
- TCP报头最少20B;UDP报头8B,但是有12B的伪首部用于校验。
- TCP可靠,因为它有三次握手四次挥手建立连接;报文头里的序号能使报文按序到达;有累计确认(因为是按序到达)和超时重传机制;有流量控制和拥塞控制机制。UDP不可靠。
参考:
计算机网路-传输层详解_善水的博客-CSDN博客_计算机网络传输层
【计算机网络】传输层知识点总结_yaoyz105-CSDN博客_计算机网络传输层知识点
传输层概述以及传输层端口_fern_girl的博客-CSDN博客_传输层端口
TCP协议的学习(二)TCP头部信息_唯一的信仰-CSDN博客_tcp头部信息
什么是TCP协议?_YUAN的博客-CSDN博客_tcp协议