目录
一、传输层功能
二、传输层协议
1.UDP协议
(1)协议格式
(2)特点
(3)缓冲区
(4)UDP注意事项
(5)基于UDP的应用层协议
2.TCP协议
(1)协议格式
(2)六位标志位
(3)TCP原理/机制
①确认应答机制(安全机制)
②超时重传机制(安全机制)
③连接管理机制(安全机制)
三次握手流程(建立连接)
四次挥手流程(关闭连接)
④滑动窗口机制(提高效率机制)
⑤流量控制机制(安全机制)(接收端安全)
⑥拥塞机制(安全机制)(发送端安全)
⑦延迟应答机制(提高效率机制)
⑧捎带应答机制(提高效率机制)
(4)TCP特点
①面向字节流
②粘包
3.TCP和UDP的区别
三、常见问题
提供端对端的接口,确保网络数据传输的可靠性(安全性)向应用层提供通信服务;
(五元组:源ip,源port,目的ip,目的port,协议号;作用:标识一个通信)
UDP传输过程类似于寄信;
①无连接:知道对端的IP和端口号就直接进传输,不需要建立连接;
②不可靠:没有确认,重传机制;如果因为网络故障该段无法发送到对方,UDP协议层不会给应用层返回任何错误信息;
③面向数据报:不能灵活的控制读写数据的次数和数量;
①没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;
②具有接收缓冲区,不能保证数据顺序一致;
UDP的socket既能读也能写,叫做全双工;
UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部),如需传输大于64K的数据,就需要在应用层手动分包,多次发送,并在接收端手动拼接;
NFS:网络文件共享;
TFTP:简单文件传输协议;
DHCP:动态主机配置协议;
BOOTP:启动协议(用于无盘设备启动);
DNS:域名解析协议;
URG:紧急指针是否有效;
ACK:确认号是否有效;
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走;
RST:对方要求重新建立连接,把携带RST标识的称为复位报文段;
SYN:请求建立连接,把携带SYN标识的称为同步报文段;
FIN:通知对方,本端要关闭了,把携带FIN标识的称为结束报文段;
发送端发送的数据报超过一定时间间隔没有收到确认应答的数据报,表示之前发送的数据报可能丢包,所以要重新发送;
一定时间:网络环境不同,是有差异的,时间太长会影响重传效率,时间太短会频繁发送重复的包,为了保证高性能通信,会动态设置计算最大超时时间,超时500ms重发,再超时2*500ms......累计一定的重传次数,认为无法正常发送数据,关闭连接;
可能丢包:发送的数据报丢包 或 确认应答数据报;
连接:对每一端来说,保持一个本端到对端的连接状态;
流程:
a)客户端发送SYN数据报到服务端,申请建立客户端到服务端的连接;
b)服务端返回SYN+ACK给客户端;
(ACK是第一次SYN的应答,SYN是申请建立服务端到客户端的连接,客户端接收到该数据报,建立客户端到服务端的连接)
c)客户端返回ACK给服务端;
(ACK是对第二次SYN的应答)
a)客户端发送FIN到服务端,申请关闭连接(客户端——>服务端的连接);
(服务端收到该数据报,状态置为CLOSE_WAIT)
b)服务端返回ACK给客户端;
(操作系统实现TCP协议时,默认机制:系统自动返回)
c)服务端发送FIN到客户端,申请关闭连接(服务端——>客户端的连接);
(客户端收到该数据报,状态置为TIME_WAIT)
d)客户端返回ACK给服务端;
“高速重发控制” 也叫 “快重传”;
作用:同时发送多个数据报,同时接收多个响应ACK,提高效率;
窗口大小:指的是无需等待确认应答而可以继续发送数据的最大值;
如何确定窗口大小:min(流量窗口大小,拥塞窗口大小);
滑动:发送后没有返回ACK的数据,都保存在发送缓冲区,接收到下一个是多少的ACK之后,可以计算出可以滑动的大小(下一个是多少 - 窗口最小序号);
根据接收端的处理能力,来决定发送端的发送速度;
作用:间接的控制发送端滑动窗口大小(发送数据的大小);
TCP引入了“慢启动”机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度进行传输数据;
慢启动的阈值(窗口最大值),当拥塞窗口超过这个阈值的时候,不再按照指数的方式增加,而是按照线性方式增长,在每次超时重发的时候,慢启动的阈值会变成原来的一半,同时拥塞窗口置位1;
马上应答,返回的流量窗口大小会比较小,接收端处理速度是比较快的,稍等一段时间,接收端消费一些接收缓冲区数据后,再返回的流量窗口大小会更大;发送端设置的滑动窗口大小就可能更大,网络数据传输的吞吐量就更高;
需要主动发送的数据报,可以和接收数据报后要返回的ACK数据报合并为一个,类似TCP三次握手中,第二次合并SYN和ACK的数据报;
创建一个TCP的socket,同时在内核中创建一个发送缓冲区和一个接收缓冲区,调用write时,数据会先写入发送缓冲区中;如果发送的字节数太长,会被拆成多个TCP的数据包发出;如果发送的字节数太短,就会先在缓冲区里等待,等到缓冲区长度差不多了,或者其他合适的时机发送出去;接收数据时,数据也是从网卡驱动程序到达内核的接收缓冲区,然后应用程序可以调用read从接收缓冲区拿数据;
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即可解决问题;