TCP、UDP、HTTP、WebSocket四种通信协议
TCP、UDP、HTTP、WebSocket四种通信协议
TCP
优点:
- 可靠性
- 全双工协议
- 开源支持多
- 应用较广泛
- 面向连接
- 研发成本低
- 报文内容不限制(IP层自动分包,重传,不大于1452bytes)
缺点:
- 操作系统:较耗内存,支持连接数有限
- 设计:协议较复杂,自定义应用层协议
- 网络:网络差情况下延迟较高
- 传输:效率低于UDP协议
特性:
- 面向连接
- 可靠性
- 全双工协议
- 基于IP层
- OSI参考模型位于传输层
- 适用于二进制传输, 长链接
UDP
优点:
- 操作系统:并发高,内存消耗较低
- 传输:效率高,网络延迟低
- 传输模型简单,研发成本低
缺点:
- 协议不可靠
- 单向协议
- 开源支持少
- 报文内容有限,不能大于1464bytes
- 设计:协议设计较复杂
- 网络:网络差,而且丢数据报文
特性:
- 无连接
- 不可靠
- 基于IP协议层
- OSI参考模型位于传输层
- 最大努力交付
- 适用于二进制传输
HTTP
优点:
- 协议较成熟,应用广泛
- 基于TCP/IP,拥有TCP优点
- 研发成本很低,开发快速
- 开源软件较多,如nginx,apache,tomcat等
缺点:
- 无状态无连接
- 只有PULL模式,不支持PUSH
- 数据报文较大
特性:
- 基于TCP/IP应用层协议
- 无状态,无连接(短链接)
- 支持C/S模式
- 适用于文本传输
注意:grpc传输就用的HTTP2
WebSocket
优点:
- 协议较成熟
- 基于TCP/IP,拥有TCP优点
- 数据报文较小,包头非常小
- 面向连接,有状态协议
- 开源较多,开发较快
缺点:
- 没发现啥缺点
特性:
- 有状态,面向连接
- 数据报头较小
- 适用于WEB3.0,以及其他即时联网通讯
- 长链接
协议选择
通过以上对协议特性分析,建议:
- 对于弱联网类游戏,必须消除类的,卡牌类的,可以直接HTTP协议,考虑安全的话直接HTTPS,或者对内容体做对称加密;
- 对于实时性,交互性要求较高,且team有过相关经验,可以优先选择websocket,其次TCP协议;
- 对于实时性要求极高,且可达性要求一般可以选择UDP协议;
- 局域网对战类,赛车类,直接来UDP协议吧(公网对战,P2P的UDP还得“打洞”处理)
常见问题
TCP与UDP的区别
- 基于连接(TCP)与无连接(UDP)
- 对系统资源的要求(TCP较多,UDP少)
- UDP程序结构较简单
- 流模式(TCP)与数据报模式(UDP)
- TCP保证数据正确性,UDP可能丢包
- TCP保证数据顺序,UDP不保证
- UDP相比TCP传输效率高
TCP协议是传输控制协议,UDP是用户数据报协议,它们都能实现端口号寻址的功能,都是传输层的协议。但是TCP协议是一种可靠的,面向连接的协议。在传输数据之前首先要建立连接,传输数据完毕后要断开连接,而UDP协议是有一种不可靠的,面向非连接的协议,但是它的传输效率比较高。
计算机网络有几层
计算机网络通常分为七层、五层和四层结构。
七层结构(OSI模型)
OSI模型(开放系统互联参考模型)是一个理论上的网络通信模型,分为七个层次:
- 物理层:处理物理传输介质上的原始比特流。
- 数据链路层:负责将原始比特流分割成帧并添加地址信息。
- 网络层:负责在不同网络之间传输数据,进行路由选择。
- 传输层:提供端到端的数据传输服务,确保数据可靠性。
- 会话层:管理会话的建立、维护和结束。
- 表示层:负责数据的格式转换和加密。
- 应用层:为用户提供网络应用服务,如文件传输、电子邮件等。
五层结构
五层结构是对OSI模型和TCP/IP模型的折中,综合了二者的优点,既简洁又能讲清楚概念。五层结构包括:
- 物理层:负责传输原始比特流。
- 数据链路层:提供可靠的数据传输。
- 网络层:负责数据包的路由选择和传递。
- 传输层:提供端到端的数据传输服务。
- 应用层:为用户提供网络应用服务。
四层结构(TCP/IP模型)
TCP/IP模型是一个实际运行的网络协议,包括四个层次:
- 网络接口层:主机与网络之间的接口。
- 互联网层:使用IP协议进行数据包的传输。
- 传输层:提供可靠的或不可靠的数据传输服务(TCP和UDP)。
- 应用层:包含所有高层协议,如HTTP、FTP、SMTP等。
计算机网络中传输数据具体实现步骤
数据从一台计算机传输到另一台计算机,需要经过应用层、传输层、网络层、数据链路层和物理层的逐层封装,并在接收端逐层拆卸。
- 应用层:指定发送的服务器的域名(或IP)和端口号,以及要发送数据的内容,然后传递给下一层传输层。
- 传输层:在把应用层的报文当成自己的数据,然后在前面拼接源端口号和目标端口号。源端口号由操作系统动态分配,目标端口号一般是固定的,用于服务器接收数据。
- 网络层:在网络层的基础上增加源IP和目标IP。源IP是本地网卡的IP地址,目标IP是服务器的IP。如果指定的是服务器的域名,则需要先通过DNS服务器将域名解析为IP。
- 数据链路层:在数据链路层的基础上增加源MAC地址和目标MAC地址。源MAC地址是本机网卡的MAC地址,目标MAC地址是下一跳网络设备(如交换机或路由器)的MAC地址。如果客户端和服务器端在同一个网段,目标MAC地址就是服务器的MAC地址;否则,数据链路层采用下一跳的机制转递数据,通过ARP协议获取下一跳的MAC地址。
- 物理层:负责在物理媒介上传输原始的比特流,通过高低电频来传送0和1这样的电信号。
在接收端,数据会按照相反的顺序逐层拆卸,从物理层开始,依次经过数据链路层、网络层、传输层和应用层,最终还原为原始数据。在传输过程中,数据可能会经过多个节点,如路由器和交换机,它们会根据数据中的地址信息将数据转发到目标机器上。
HTTP的长连接
HTTP长连接的概念,以及HTTP与TCP的关系,简单概括一下就是:
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。每个HTTP连接完成后,其对应的TCP连接并不是每次都会关闭。从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这个头部字段:Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache,Nginx,Nginx中这个默认时间是 75s)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。