UDP和TCP
1 UDP协议
用户数据报协议UDP具有复用、分用以及差错检测的功能。
特点:
- UDP是无连接的,即发送数据之前不需要建立连接,因此也减少了开销和发送数据的延迟。
- UDP使用尽最大努力交付,即不保证可靠的交付,因此主机不需要维持复杂的连接状态。
- UDP是面向报文的,即对需要进行网络传输的数据直接传输,不会进行其他操作,比如当传输数据过大时进行分片多次传输。
- UDP没有拥塞控制,即不会因为网络出现拥堵而降低传输效率。
- UDP支持一对一、一对多、多对一和多对多的交互通信。
- UDP的开销小,UDP在发送时,其首部只占用8字节。
2 TCP协议
传输控制协议TCP具有可靠传输、流量控制和拥塞控制等功能。TCP协议是TCP/IP中非常复杂的一个协议(IP协议,即比TCP协议更底层的一个通信协议)。
特点:
- TCP协议是面向连接的,即使用TCP协议之前必须建立TCP连接,通信结束后需要释放TCP连接。
- TCP协议只能进行P2P(point to point,点对点、一对一)通信。
- TCP协议提供可靠交付,即无差错、不丢失、不重复。
- TCP协议是全双工通信,即通信双方都可以在任何时候进行收发数据。
- TCP协议是面向字节流的,即它并不关心传输的内容,只是把这些数据看作无结构的字节进行传输。
- TCP的开销比UDP大,TCP的首部占用20字节(开销大并不仅仅是首部大小上一个方面)。
3 UDP和TCP的区别
用户数据报协议UDP | 传输控制协议TCP |
---|---|
无连接的 | 面向连接的 |
不可靠传输 | 可靠传输 |
可以进行一对一、一对多、多对一和多对多的通信 | 只能进行一对一通信 |
没有拥塞控制 | 实现了拥塞控制 |
开销小 | 开销大 |
面向报文的 | 面向字节流的 |
4 TCP的三次握手
过程:
- 第一次握手:客户端进程A创建TCP连接,并向服务器进程B发出连接请求报文(A将自己的通信序列号发送给B)。
- 第二次握手:服务器进程B收到连接请求报文后,如果同意连接,则向客户端A发送确认(B收到了A的序列号,并将自己的序列号发送给A,同时通知A我知道你的序列号了)。
- 第三次握手:客户端进程A接收到服务器进程B的确认后,需要向其给出确认(A收到了B的序列号,并告知B我知道了你的序列号)。此时,正式建立连接。
为什么不是两次?
答:为了防止发出的已经失效的连接请求突然又传送到了B,因而产生错误。即以下的情况:A发送连接请求(记为Link1)至B,但是由于网络问题Link1在某一处滞留了,而一段实际内A没有收到B的确认,则再次发送连接请求,并且此次请求成功了,A和B在通信结束后释放了连接。此时Link1(刚刚滞留的连接)结束了滞留又发送到了B,如果是两次握手,那么在B发送响应后连接就建立了,并且此时B就在等待A发送数据,而A接收到B的确认后并不会理会,因为A没有发送请求(Link滞留时A已经默认连接失败了)。此时就造成了B的资源浪费。
为什么不是更多次?
答:进行了两次握手的分析之后,可以得知三次握手已经可以使A和B建立可靠的连接,再进行更多次的重复确认并不能提高TCP协议的可靠性,反而会提高TCP协议的开销,得不偿失。(况且,虽然TCP协议被称为可靠的协议,但是只是相对性的,并不会出现100%可靠的协议,所以也没有必要进行反复的确认)