网络——传输层(详细版)

目录

一、传输层功能

二、传输层协议

1.UDP协议

(1)协议格式

(2)特点

(3)缓冲区

(4)UDP注意事项

(5)基于UDP的应用层协议

2.TCP协议

(1)协议格式

(2)六位标志位

(3)TCP原理/机制

        ①确认应答机制(安全机制)

        ②超时重传机制(安全机制)

        ③连接管理机制(安全机制)

                        三次握手流程(建立连接)           ​

                        四次挥手流程(关闭连接

        ④滑动窗口机制(提高效率机制)

        ⑤流量控制机制(安全机制)(接收端安全)

        ⑥拥塞机制(安全机制)(发送端安全)

        ⑦延迟应答机制(提高效率机制)

        ⑧捎带应答机制(提高效率机制)

(4)TCP特点

        ①面向字节流

        ②粘包

3.TCP和UDP的区别

三、常见问题


一、传输层功能

提供端对端的接口,确保网络数据传输的可靠性(安全性)向应用层提供通信服务;

(五元组:源ip,源port,目的ip,目的port,协议号;作用:标识一个通信)


二、传输层协议

1.UDP协议

(1)协议格式

网络——传输层(详细版)_第1张图片

  • 16位的源端口/16位的目的端口:描述数据从哪个进程发送到哪个进程 – 负责实现应用程序间的数据传输
  • 16位的数据报长度:包含UDP报文头部在内的整体报文长度,16位存储的最大数字为65535
  • 16位的校验和:二进制反码求和算法,用于校验接收到的数据和发送的数据是否一致
  • 发送方在发送数据之前,校验和为0,从完整报文的第0个字节开始,每个字节进行取反相加,超过16位的部分取出来,再次与低16位进行相加,最后得到一个校验和填充到协议字段中
  • 接收方接收到数据之后,从完整报文的第0个字节开始,每个字节进行取反相加,最终的结果如果为0,则表示数据一致,否则则表示数据不一致

(2)特点

UDP传输过程类似于寄信;

①无连接:知道对端的IP和端口号就直接进传输,不需要建立连接;

②不可靠:没有确认,重传机制;如果因为网络故障该段无法发送到对方,UDP协议层不会给应用层返回任何错误信息;

③面向数据报:不能灵活的控制读写数据的次数和数量;

(3)缓冲区

①没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;

②具有接收缓冲区,不能保证数据顺序一致;

UDP的socket既能读也能写,叫做全双工;

(4)UDP注意事项

UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部),如需传输大于64K的数据,就需要在应用层手动分包,多次发送,并在接收端手动拼接;

(5)基于UDP的应用层协议

NFS:网络文件共享;

TFTP:简单文件传输协议;

DHCP:动态主机配置协议;

BOOTP:启动协议(用于无盘设备启动);

DNS:域名解析协议;

2.TCP协议

(1)协议格式

网络——传输层(详细版)_第2张图片

  • 16位的源端口和目的端口:负责应用程序之间的数据传输
  • 32位序号/32位确认序号:实现确认应答机制以及接收端的包序管理
  • 4位头部长度:表示TCP头部有多少,TCP头部是不定长的,主要取决于选项数据的大小,TCP头部最小为20字节,最大60字节(选项数据中占0~40字节)
  • 6位保留位:目前没有想好用来干什么,先预留出来用于以后扩展
  • 6位标志位:URG/ACK/PSH/RST/SYN/FIN
  • 16位窗口大小:表示本端可以接收的数据大小,用于实现滑动窗口机制,进行流量控制
  • 16位校验和:二进制反码求和算法,校验数据接收与发送的一致性
  • 16位紧急指针:标识哪些数据是紧急数据(带外数据)
  • 0-40字节的选项数据:通常用于协商一些信息如MSS的长度

(2)六位标志位

URG:紧急指针是否有效;

ACK:确认号是否有效;

PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走;

RST:对方要求重新建立连接,把携带RST标识的称为复位报文段;

SYN:请求建立连接,把携带SYN标识的称为同步报文段;

FIN:通知对方,本端要关闭了,把携带FIN标识的称为结束报文段;

(3)TCP原理/机制

        ①确认应答机制(安全机制)

网络——传输层(详细版)_第3张图片

        ②超时重传机制(安全机制)

发送端发送的数据报超过一定时间间隔没有收到确认应答的数据报,表示之前发送的数据报可能丢包,所以要重新发送;

一定时间:网络环境不同,是有差异的,时间太长会影响重传效率,时间太短会频繁发送重复的包,为了保证高性能通信,会动态设置计算最大超时时间,超时500ms重发,再超时2*500ms......累计一定的重传次数,认为无法正常发送数据,关闭连接;

可能丢包:发送的数据报丢包 或 确认应答数据报;

        ③连接管理机制(安全机制)

连接:对每一端来说,保持一个本端到对端的连接状态;

                        三次握手流程(建立连接)

                        网络——传输层(详细版)_第4张图片

流程:

a)客户端发送SYN数据报到服务端,申请建立客户端到服务端的连接;

b)服务端返回SYN+ACK给客户端;

(ACK是第一次SYN的应答,SYN是申请建立服务端到客户端的连接,客户端接收到该数据报,建立客户端到服务端的连接)

c)客户端返回ACK给服务端;

(ACK是对第二次SYN的应答)

                        四次挥手流程(关闭连接)

                           网络——传输层(详细版)_第5张图片

 a)客户端发送FIN到服务端,申请关闭连接(客户端——>服务端的连接);

        (服务端收到该数据报,状态置为CLOSE_WAIT)

b)服务端返回ACK给客户端;

        (操作系统实现TCP协议时,默认机制:系统自动返回)

c)服务端发送FIN到客户端,申请关闭连接(服务端——>客户端的连接);

        (客户端收到该数据报,状态置为TIME_WAIT)

d)客户端返回ACK给服务端;

        ④滑动窗口机制(提高效率机制)

“高速重发控制” 也叫 “快重传”;

作用:同时发送多个数据报,同时接收多个响应ACK,提高效率;

窗口大小:指的是无需等待确认应答而可以继续发送数据的最大值;

如何确定窗口大小:min(流量窗口大小,拥塞窗口大小);

滑动:发送后没有返回ACK的数据,都保存在发送缓冲区,接收到下一个是多少的ACK之后,可以计算出可以滑动的大小(下一个是多少 - 窗口最小序号);

        ⑤流量控制机制(安全机制)(接收端安全)

根据接收端的处理能力,来决定发送端的发送速度;

作用:间接的控制发送端滑动窗口大小(发送数据的大小);

        ⑥拥塞机制(安全机制)(发送端安全)

TCP引入了“慢启动”机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度进行传输数据;

慢启动的阈值(窗口最大值),当拥塞窗口超过这个阈值的时候,不再按照指数的方式增加,而是按照线性方式增长,在每次超时重发的时候,慢启动的阈值会变成原来的一半,同时拥塞窗口置位1;

        ⑦延迟应答机制(提高效率机制)

马上应答,返回的流量窗口大小会比较小,接收端处理速度是比较快的,稍等一段时间,接收端消费一些接收缓冲区数据后,再返回的流量窗口大小会更大;发送端设置的滑动窗口大小就可能更大,网络数据传输的吞吐量就更高;

        ⑧捎带应答机制(提高效率机制)

需要主动发送的数据报,可以和接收数据报后要返回的ACK数据报合并为一个,类似TCP三次握手中,第二次合并SYN和ACK的数据报;

(4)TCP特点

        ①面向字节流

创建一个TCP的socket,同时在内核中创建一个发送缓冲区和一个接收缓冲区,调用write时,数据会先写入发送缓冲区中;如果发送的字节数太长,会被拆成多个TCP的数据包发出;如果发送的字节数太短,就会先在缓冲区里等待,等到缓冲区长度差不多了,或者其他合适的时机发送出去;接收数据时,数据也是从网卡驱动程序到达内核的接收缓冲区,然后应用程序可以调用read从接收缓冲区拿数据;

TCP的一个连接,既有发送缓冲区也要接收缓冲区,那么对于这一个连接,既可以读数据,也可以写数据,这叫做全双工

        ②粘包

表示应用层读取多组数据时,一定要规定号一个业务的数据格式(应用层协议)

产生原有:没有明确数据报的边界;(UDP不存在粘包问题)

3.TCP和UDP的区别

1)UDP是无连接的,不可靠,但效率更高

      TCP是有连接,可靠传输,效率相对UDP更差

2)UDP是面向数据报(一次发,一次收)

      TCP是面向字节流(多次发,多次收)

3)UDP没有发送缓冲区,有接收缓冲区

      TCP既有发送缓冲区也有接收缓冲区

(基于TCP和UDP程序,既可以发也可以收,叫做全双工)

4)UDP数据大小受限

      TCP数据大小不限

5)TCP提供了很多可靠传输机制


三、常见问题

1)问:基于传输层UDP协议,如何传输超过64k的数据?如何保证可靠传输?

----->在应用层实现类似TCP所有可靠传输机制;

2)问:连接管理机制中为什么是四次挥手,能不能是三次?

----->第二次是系统自动返回,第三次是手动调用close关闭连接才返回;

问:为什么不能合并?

----->TCP协议栈实现时,就不包含主动发的FIN,交给程序自己实现;(程序关闭前,可以完成一些前置工作,如释放资源等操作)

问:第三步,客户端收到FIN以后,为什么还不能置为关闭状态,而要等待一定的时间?

----->第四步的ACK也可能丢包,这种情况下,服务端会基于超时重传机制,重发FIN,如果客户端关闭连接,就无法处理这个数据报;

问:为什么TIME_WAIT的时间时2MSL?

----->MSL是TCP报文的最大生存时间,如果最后一步的ACK丢包,上一步的FIN还需要再发一次;

问:为什么服务器出现大量的CLOSE_WAIT?

----->原因是服务器没有正确的关闭socket,导致四次挥手没有正确完成,这是一个BUG,只需要加上对应的CLOSE即可解决问题;

你可能感兴趣的:(计算机网络,网络)