这是头些天跟公司同事讨论的问题,记录在此,以免年纪大忘了,这个问题很大,目前理解的肯定不全面,因而会持续更新。
1、协议本身来说,TCP是面向连接的,靠谱的,全双工的,流传输。用靠谱代替可靠,因为可靠容易误会,靠谱是指网络或对端出现问题,TCP会告诉你。TCP为了尽量保证靠谱,增加了很多特性,比如有序,重传,ACK,拥塞控制,滑动窗口,checksum,对于面向连接来说又有了三次握手建立连接,四层挥手断开连接,内部状态机维护连接状态,通过SYN,ACK啥的创建连接和数据传输。UDP是无连接的数据包传输。
2、从网络设备角度,一般都是对TCP更友好一些。(1)有些公共场所的防火墙是禁止UDP的,所有UDP的连通性很难达到100%,为了连通性,很多APP也都是基于TCP的。(2)路由器中一般也会更照顾TCP,一般TCP的优先级较高,丢包也尽量选择丢UDP的包,这一点是同事说的,我还得去进一步了解下。(3)网关中的NAT也是对TCP更友好一些,TCP的NAT老化时间更长,因而需要很少的ping包来保活,因而TCP在这方面会更省电一些。(4)一些负载均衡服务对TCP支持的更多一些,很多也是先支持TCP,然后再支持UDP,AWS的ELB目前居然还不支持UDP。
3、从安全角度,虽然TCP服务端存在SYN flood风险,但做为TCP client,由于只能接收序列号在接收窗口范围内的包,所以对于伪造源IP的攻击也会比UDP更难一些。
网友评论