1. TCP和UDP的区别
(1)TCP是面向连接的,而UDP不需要进行连接;
(2)TCP进行可靠传输,而UDP提供不可靠传输。(通过TCP传输的数据无差错,不丢失,不重复,且按序到达;而UDP尽最大努力交付,可能会出现丢包现象。)
(3)TCP是面向字节流的,而UDP是面向报文的。(TCP把应用程序交下来的数据仅视为一连串的无结构的字节流;发送方UDP对应用层交下来的报文,在添加首部后就向下交付给IP层,既不合并,也不拆分,而是保留这些报文的边界;接收方UDP对IP层交上来UDP用户数据报,在去除首部后就原封不动地交付给上层应用进程)
(4)TCP只能是一对一的,即每条TCP连接只能有两个端口,而UDP可以是一对一的,也可以是一对多的。
(5)TCP首部较大为20字节,而UDP为8字节。
(6)TCP适合大规模数据的传输,UDP适合对实时性要求高但对丢包率要求不太高的场景,如IP电话和视频会议等。
2. TCP的三次握手和四次挥手
3.为什么不是两次握手?
首先,明确三次握手做了什么:
第一次握手,服务端发送连接请求报文;
第二次握手,服务端接收到请求报文后,如果同意连接,就向客户端发回确认,并为该TCP连接分配TCP缓存和变量;
第三次握手,客户端收到确认报文后,还要向服务器给出确认,并且也要给该连接分配缓存和变量;
不采用两次握手是为了防止两次握手情况下已失效的连接请求报文段突然又传送到服务端而产生错误。
考虑下面这种情况??突向服务器B发出TCP连接请求,第一个连接请求报文在网络的某个节点长时间滞留,A超时后认为报文丢失,于是再重传一次连接请求,B收到到后建立连接。数据传输完毕后双方断开连接。而此时,前一个滞留再网络中的请求报文到达服务器B,而B认为A又发来请求, 此时若采用“三次握手”,则B向A发送确认报文段,由于是一个失效的请求,因此A不予理睬,建立连接失败。若采用的是“两次握手”,则这种情况下B认为传输连接已经建立,并一直等待A传输数据,而A此时并无连接请求,因此不予理睬,这样就造成了B的资源白白浪费。
4.为什么建立连接是三次握手,而断开连接时是四次挥手?
(转载自:http://08643.cn/p/bbb6261cb13e)
首先,明确四次挥手做了什么:
A向B发起请求,表示A没有数据要发送了:A——>B;
B向A发送信号,确认A的断开请求请求:B——>A;
B向A发送信号,请求断开连接,表示B没有数据要发送了:B——>A;
A向B发送确认信号,同意断开:A——>B。
B收到确认信号,断开连接,而A进入TIME-WAIT状态,在一段时间内(2MSL)没收到B的信号,表明B已经断开了,于是A也断开了连接。至此,完成挥手过程。
问:为什么 A 要进入 TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态?
为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进入 CLOSED 状态,如果确认应答因为网络问题一直没有到达,那么会造成 B 不能正常关闭。
采用四次挥手是因为此时A虽然不再发送数据了,但是还可以接收数据,B可能还有数据要发送给A,所以两次挥手不能合并为一次。
挥手次数比握手多一次,是因为握手过程,通信只需要处理连接。而挥手过程,通信需要处理数据+连接。