-
TCP 面向连接(如打电话要先拨号建立连接)提供可靠的服务;UDP 是无连接的,即发送数据之前不需要建立连接,;UDP 尽最大努力交付,即不保证可靠交付。(由于 UDP 无需建立连接,因此 UDP 不会引入建立连接的时延,TCP 需要在端系统中维护连接状态,比如接受和发送缓存,拥塞控制,序号与确认号的参数等,故 TCP 会比 UDP 慢)
-
UDP 具有较好的实时性,工作效率比 TCP 高,适用于对高速传输和实时性有较高的通信或广播通信。
-
每一条 TCP 连接只能是一对一的;UDP 支持一对一,一对多,多对一和多对多的交互通信
-
UDP 分组首部开销小,TCP 首部开销 20 字节;UDP 的首部开销小,只有 8 个字节。
-
TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的(一次交付一个完整的报文,报文不可分割,报文是 UDP 数据报处理的最小单位)。
-
UDP 适合一次性传输较小数据的网络应用,如 DNS,SNMP 等
什么是三次握手四次挥手?tcp 为什么要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
四次挥手
客户端先发送 FIN,进入 FIN_WAIT1 状态,用来关闭 Client 到 Server 的数据传送服务端收到 FIN,发送 ACK,进入 CLOSE_WAIT 状态,客户端收到这个 ACK,进入 FIN_WAIT2状态。
服务端发送 FIN,进入 LAST_ACK 状态,用来关闭 Server 到 Client 的数据传送客户端收到 FIN,发送 ACK,进入 TIME_WAIT 状态,服务端收到 ACK,进入 CLOSE 状态(等待 2MSL 时间,约 4 分钟。主要是防止最后一个 ACK 丢失。)
第一次挥手:主动关闭方发送一个 FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在 fin 包之前发送出去的数据,如果没有收到对应的 ack 确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到 FIN 包后,发送一个 ACK 给对方,确认序号为收到序号+1(与SYN 相同,一个 FIN 占用一个序号)。
第三次挥手:被动关闭方发送一个 FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到 FIN 后,发送一个 ACK 给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。