注:个人笔记,仅供参考
TCP(80)和UDP都是传输层协议,主要区别在于传输方式和可靠性
TCP是面向字节流的协议,不保留应用层消息边界面;通过三次握手建立连接,四次挥手断开连接,还通过序列号、确认应答、超时重传等机制保证数据可靠、有序到达,同时还具有流量控制和拥塞控制机制,这些机制也会带来一定开销
UDP是面向数据报的协议,每次发送有独立的边界;是面向无连接的协议,发送数据前不需要建立连接,也不保证数据一定到达、也不保证按顺序到达。协议开销比较小,传输延迟比较低。
TCP通常用于文件传输、HTTP通信等对数据完整性比较高的场景;
UDP常用于音视频、在线游戏等对实时性要求比较高的场景
另外:
UDP可以再应用层面自定义可靠的确认、重传、控制顺序;
TCP也不能够保证数据最终一定能到达,例如中断连接,传输就会失败
传统的HTTP/1.1、HTTP/2通常是运行在TCP之上,HTTP需要靠有可靠、有序的数据传输。因此很适合。
HTTP/3使用QUIC。是基于UDP实现的可靠传输。
TCP三次握手过程:
客户端发送SYN,携带初始序列号seq = x,表示请求建立连接。
服务端接收到后回复SYN + ACK,携带seq = y、ack = x +1,表示收到请求,同时发起自己的序列号同步
客户端回应ACK,携带ack = y+1,确认收到服务端SYN,连接建立。
为什么是三次:
如果是两次握手,那服务器不确定客户端是否收到自己的回复,如果网络中有一个延迟很少的旧连接,服务器可能会误认为是新连接请求而创建连接,造成资源浪费。
四次挥手的过程:
客户端主动关闭,服务器被动关闭
客户端发送关闭请求FIN;
服务器收到并发送ACK确认,等数据发完暂时不关闭;
服务器数据接收完发送关闭请求FIN,表示自己也要关闭发送;
客户端发送ACK确认收到服务器关闭请求,随后进入TIME_WAIT,等待一段时间关闭连接;
为什么是四次:
因为TCP通信时全双工通信,需要双方都分别关闭 ;主动关闭方发送FIN,被动关闭方先回复ACK,等待数据发送完成后再发送FIN,主动关闭方最后再回复ACK。
为什么客户端最后要TIME_WAIT:(一般是两个报文生存空间)
也有可能会问CLOSE_WAIT是什么
本机收到对方的FIN并返回ACK,本机进入CLOSE_WAIT状态。这说明对端已经关闭了它的发送方向,但是本机还没有完成关闭操作。关闭待完成。
如果服务器存在大量的CLOSE_WAIT那就可能是对端收到关闭通知,但是没及时关闭对应套接字
