- 浏览: 127019 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (111)
- 资料总结参阅 (2)
- To Study List (2)
- notepaper (2)
- linux学习 (32)
- linux学习-included (3)
- 开源框架-Hibernate (2)
- 开源框架-Ibatis (1)
- JEE整理 (25)
- JEE Server参考 (5)
- 开源框架-Spring (1)
- 硬件知识 (5)
- 开发环境搭建及管理 (7)
- linux软件工具 (2)
- 数据库 (8)
- 各类文档参考 (1)
- 开源框架-Netty (1)
- 性能调优 (1)
- DP相关 (1)
- 软件知识 (3)
- 脚本语言-python (2)
- 脚本语言-perl (1)
- 分布式 (2)
最新评论
-
zhuxinhua:
谢谢,,这东西真不容易找啊。。
JBoss配置---收集中...
refer to: http://www.cnitblog.com/tarius.wu/articles/434.html
1 . Layered Model of Networking
Socket 编程的层次模型如下图所示,
最上面是应用层,应用层下面的是 SOCKET API 层,再下面是传输层和网络层…… 实际上, Sockets API 层并不是一个真正定义的网络层次,但却很好的描述了 Socket 编程所处的位置和所扮演的角色。
TCP 状态转换图
2 .什么是 SOCKET ?
简单的, Socket 可以被定义描述为两个应用通信通道的端点。一个 Socket 端点可以用 Socket 地址来描述, Socket 地址结构由 IP 地址,端口和使用协议组成( TCP or UDP )。
3 . Socket 地址结构
网络中以主机 IP 、端口以及使用的协议表明一个网络应用。 UNIX Socket 将它们组成一个结构,统称为 SOCKET 地址结构。
3.1 IPv4 对应的 SOCKET 地址结构
通常也称为“网际 SOCKET 地址结构”,以“ socketaddr_in ”命名,定义在头文件 <netinet/in.h> 中。
所涉及到的数据类型:
3.2 IPv6 对应的 SOCKET 地址结构
3.3 通用地址结构
当地址结构作为传递给任何一个 SOCKET 函数的参数时,任意一个 Socket 函数必须能处理每一种地址结构,为了解决这个问题,提出了使用通用套接口地址结构。当任何一个地址结构要作为指针参数传到套接口函数时,必须要显示转化为通用地址结构。
在 IPv4 应用中,使用的通用地址结构为 struct sockaddr, 定义在 <sys/socket.h> 中,
例如:
在 IPv6 中,提出了一种新的通用地址结构: struct sockaddr_storage 定义在<netinet/in.h>中。
struct sockaddr 和 struct sockaddr_storage 的区别
<!--[if !supportLists]-->a.<!--[endif]-->struct sockaddr_storage能提供严格的结构对齐
<!--[if !supportLists]-->b. <!--[endif]-->struct sockaddr_storage能容纳系统支持的更大的地址结构
3.4 Socket 地址结构的比较
4 . Client/Server Model
Client/Server 的网络通信模型是使用最广最为基础的通信模型。在 Socket API 环境,其应用可以归纳为:
TCP 链接建立
根据 TCP/IP 协议,函数 connect() 激发 TCP 的三路握手过程。
客户端给服务器一个 SYN(J) 信号,服务器返回一个 ACK(J+1); 然后服务器给客户端一个 SYN(K), 客户端也同样给服务器一个 ACK(K+1) ,这样就算 connect 成功。
注意:服务器返回的 SYN(K) 和 ACK(J+1) 是放在同一个分节中发给客户端的,因此链路在建立连接时只用了三个分节,故称为三路握手。
TCP 链接终止
TCP 用三个分节建立一个链接,而终止连接时需要四个分节。原因在于被动关闭链接一方需要关闭处理时间,因此 ACK 和 FIN 不能同时发给主动关闭一方。
主动关闭一方在收到 ACK 后,在等待被动关闭方发 FIN 消息这一状态称为处于 TIME_WAIT 状态。
5 Socket API 描述
5.1 创建套接字—— socket 函数
应用程序在使用套接字前,必须拥有一个套接字,系统调用 socket ()向应用程序提供
创建套接字的手段,其调用格式如下:
参数 family 指定通信发生的区域, UNIX 系统支持的地址族有: AF_UNIX,AF_INET,AF_NS 等,而 DOS 、 WINDOWS 中仅支持 AF_INET ,它是网际网区域。因此,地址族与协议族相同。
参数 type 描述要建立的套接字的类型。参数 protocol 说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为 0 ,使用默认的连接模式。根据这 3 个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此, socket ()系统调用实际上指定了 " 协议 " 。
5.2 指定本地址—— bind 函数
一个套接字用 socket ()创建后,存在一个名字空间(地址族),但它没有被命名。 Bind ()将套接字地址(包括本地主机地址和本断口地址)与所创建的套接字号联系起来,即将,名字赋予套接字,以指定本地半相关。其调用格式如下:
参数 socketfd 是由 socket() 调用返回的并且未作连接的套接字描述符(套接字号)。参数 myaddr 是赋给套接字 socketfd 的本地地址(名字),其长度可变,结构随通信域的不同而不同。 addrlen 表明了 name 的长度。
进程可以把一个特定的 IP 地址捆绑到它的套接口上,但此 IP 地址必须是主机的一个接口。对于 TCP 客户端,这就为在此套接口上发送的 IP 数据包分配了源 IP 地址。对于服务器端,这样做就限制了套接口只接收来自那些目的地址为此 IP 地址的客户链接。
对于 TCP ,调用函数 bind 可以指定一个端口号,指定一个 IP 地址,可以两者都指定,也可以一个都不指定。对于服务器,一般指定众所周知的端口号。而不指定具体的 IP 地址。如果 TCP 服务器不把地址绑到套接口上,那么内核就把客户所发 SYN 所在分组的目的 IP 地址作为服务器的源 IP 地址。
若指定端口号为 0 ,则调用函数 bind 时,内核选择一个临时端口;但若指定一个通配 IP 地址,则直到套接口以连接 (TCP) 或数据报已在套接口上发出 (UDP), 内核才选择一个本地 IP 。
注意到在第四部分图中,客户端并没有调用 bind 函数,因为对于客户端来说,没有必要指定具体的 IP 和端口,如果需要,内核会选择一个源 IP 地址和一个临时的端口。
5.3 connect 函数
TCP 客户用 connect() 函数建立一个与 TCP 服务器的链接。 Connect ()的调用格式如下:
参数 socket 是欲建立连接的本地套接字描述符。参数 servaddr 指出说明对方套接字地址结构指针。对方套接字地址长度由 addrlen 说明。
根据 TCP 的状态转移图,函数 connect 导致从 CLOSED 状态 ( 调用函数 socket 创建套接口以后就一直处于此状态 ) 转到 SYN_SENT 状态,若成功转到 ESTABLISHED 状态。如果函数 connect 失败,则原先创建的套接口就不可再用,必须关闭。如要重新尝试,必须重新调用 socket ,再 connect 。
5.4 listen 函数
函数 listen 仅被 TCP 服务器调用,它做两件事情:
<!--[if !supportLists]-->1. <!--[endif]-->当函数socket创建一个套接口时,它被假设为一个主动套接口,也就是说,它是一个将调用connect发起链接的客户套接口。函数listen将未链接的套接口转换成被动套接口,告诉内核应接受指向此套接口的链接请求。根据TCP状态转移图,函数listen导致套接口状态从CLOSED转到LISTEN。
<!--[if !supportLists]-->2. <!--[endif]-->函数的第二个参数规定了内核为此套接口排队的最大链接个数。
一般而言,此函数应该在 socket 和 bind 之后,调用函数 accept 之前调用。
参数 backlog 的解析:
对于给定的监听套接口 (listen 之后 ) ,内核要维护两个队列:一个是处于三次握手过程中(即客户端调用 connect ,服务器端收到 SYN ,并返回 ACK 和 SYN 后,在等待客户端的 ACK ),处于 SYN_RCVD 状态;另一个是从 connect 成功,处于 ESTABLISHED 状态。
两个队列之和不能超过 backlog 。
5.5 accept 函数
Accept 函数由 TCP 服务器调用,从已完成连接队列头返回一个已完成的链接。若已完成队列为空,则进程睡眠(假定套接口为缺省的阻塞方式)。用于使服务器等待来自某客户进程的实际连接。
参数 cliaddr 和 addrlen 用来返回链接对方进程(客户端)的协议地址。
若函数成功返回,返回值是一个由内核自动生成的全新的描述字,代表与客户端的链接。当我们讨论函数 accept 时,常把它的第一个参数称为监听套接口描述字(由 socket 生成的描述字);把它的返回值称为已连接套接口描述字。
6 Reference
补上参考书目及一些好文章
1. Windows Sockets 网络程序设计大全
适合于WinSock编程入门。
2. Unix Networking Programming 3rd ed
很经典的书呀,如果你学习Unix Socket编程,你必须买的,学习WinSock也有作用的,因为WinSock是参考的Unix Socket。
3. Windows网络编程技术
讲了Win2000下的WinSock编程,讲了TCP/IP, Netbios, IPX/SPX, ATM等在Windows下的编程,有很多代码,还有一个MS Platform SDK的东西,这可是很难得的。对了,还有QoS和Raw Socket编程的程序例子。
1 . Layered Model of Networking
Socket 编程的层次模型如下图所示,
最上面是应用层,应用层下面的是 SOCKET API 层,再下面是传输层和网络层…… 实际上, Sockets API 层并不是一个真正定义的网络层次,但却很好的描述了 Socket 编程所处的位置和所扮演的角色。
TCP 状态转换图
2 .什么是 SOCKET ?
简单的, Socket 可以被定义描述为两个应用通信通道的端点。一个 Socket 端点可以用 Socket 地址来描述, Socket 地址结构由 IP 地址,端口和使用协议组成( TCP or UDP )。
3 . Socket 地址结构
网络中以主机 IP 、端口以及使用的协议表明一个网络应用。 UNIX Socket 将它们组成一个结构,统称为 SOCKET 地址结构。
3.1 IPv4 对应的 SOCKET 地址结构
通常也称为“网际 SOCKET 地址结构”,以“ socketaddr_in ”命名,定义在头文件 <netinet/in.h> 中。
所涉及到的数据类型:
3.2 IPv6 对应的 SOCKET 地址结构
3.3 通用地址结构
当地址结构作为传递给任何一个 SOCKET 函数的参数时,任意一个 Socket 函数必须能处理每一种地址结构,为了解决这个问题,提出了使用通用套接口地址结构。当任何一个地址结构要作为指针参数传到套接口函数时,必须要显示转化为通用地址结构。
在 IPv4 应用中,使用的通用地址结构为 struct sockaddr, 定义在 <sys/socket.h> 中,
例如:
在 IPv6 中,提出了一种新的通用地址结构: struct sockaddr_storage 定义在<netinet/in.h>中。
struct sockaddr 和 struct sockaddr_storage 的区别
<!--[if !supportLists]-->a.<!--[endif]-->struct sockaddr_storage能提供严格的结构对齐
<!--[if !supportLists]-->b. <!--[endif]-->struct sockaddr_storage能容纳系统支持的更大的地址结构
3.4 Socket 地址结构的比较
4 . Client/Server Model
Client/Server 的网络通信模型是使用最广最为基础的通信模型。在 Socket API 环境,其应用可以归纳为:
TCP 链接建立
根据 TCP/IP 协议,函数 connect() 激发 TCP 的三路握手过程。
客户端给服务器一个 SYN(J) 信号,服务器返回一个 ACK(J+1); 然后服务器给客户端一个 SYN(K), 客户端也同样给服务器一个 ACK(K+1) ,这样就算 connect 成功。
注意:服务器返回的 SYN(K) 和 ACK(J+1) 是放在同一个分节中发给客户端的,因此链路在建立连接时只用了三个分节,故称为三路握手。
TCP 链接终止
TCP 用三个分节建立一个链接,而终止连接时需要四个分节。原因在于被动关闭链接一方需要关闭处理时间,因此 ACK 和 FIN 不能同时发给主动关闭一方。
主动关闭一方在收到 ACK 后,在等待被动关闭方发 FIN 消息这一状态称为处于 TIME_WAIT 状态。
5 Socket API 描述
5.1 创建套接字—— socket 函数
应用程序在使用套接字前,必须拥有一个套接字,系统调用 socket ()向应用程序提供
创建套接字的手段,其调用格式如下:
参数 family 指定通信发生的区域, UNIX 系统支持的地址族有: AF_UNIX,AF_INET,AF_NS 等,而 DOS 、 WINDOWS 中仅支持 AF_INET ,它是网际网区域。因此,地址族与协议族相同。
参数 type 描述要建立的套接字的类型。参数 protocol 说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为 0 ,使用默认的连接模式。根据这 3 个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此, socket ()系统调用实际上指定了 " 协议 " 。
5.2 指定本地址—— bind 函数
一个套接字用 socket ()创建后,存在一个名字空间(地址族),但它没有被命名。 Bind ()将套接字地址(包括本地主机地址和本断口地址)与所创建的套接字号联系起来,即将,名字赋予套接字,以指定本地半相关。其调用格式如下:
参数 socketfd 是由 socket() 调用返回的并且未作连接的套接字描述符(套接字号)。参数 myaddr 是赋给套接字 socketfd 的本地地址(名字),其长度可变,结构随通信域的不同而不同。 addrlen 表明了 name 的长度。
进程可以把一个特定的 IP 地址捆绑到它的套接口上,但此 IP 地址必须是主机的一个接口。对于 TCP 客户端,这就为在此套接口上发送的 IP 数据包分配了源 IP 地址。对于服务器端,这样做就限制了套接口只接收来自那些目的地址为此 IP 地址的客户链接。
对于 TCP ,调用函数 bind 可以指定一个端口号,指定一个 IP 地址,可以两者都指定,也可以一个都不指定。对于服务器,一般指定众所周知的端口号。而不指定具体的 IP 地址。如果 TCP 服务器不把地址绑到套接口上,那么内核就把客户所发 SYN 所在分组的目的 IP 地址作为服务器的源 IP 地址。
若指定端口号为 0 ,则调用函数 bind 时,内核选择一个临时端口;但若指定一个通配 IP 地址,则直到套接口以连接 (TCP) 或数据报已在套接口上发出 (UDP), 内核才选择一个本地 IP 。
注意到在第四部分图中,客户端并没有调用 bind 函数,因为对于客户端来说,没有必要指定具体的 IP 和端口,如果需要,内核会选择一个源 IP 地址和一个临时的端口。
5.3 connect 函数
TCP 客户用 connect() 函数建立一个与 TCP 服务器的链接。 Connect ()的调用格式如下:
参数 socket 是欲建立连接的本地套接字描述符。参数 servaddr 指出说明对方套接字地址结构指针。对方套接字地址长度由 addrlen 说明。
根据 TCP 的状态转移图,函数 connect 导致从 CLOSED 状态 ( 调用函数 socket 创建套接口以后就一直处于此状态 ) 转到 SYN_SENT 状态,若成功转到 ESTABLISHED 状态。如果函数 connect 失败,则原先创建的套接口就不可再用,必须关闭。如要重新尝试,必须重新调用 socket ,再 connect 。
5.4 listen 函数
函数 listen 仅被 TCP 服务器调用,它做两件事情:
<!--[if !supportLists]-->1. <!--[endif]-->当函数socket创建一个套接口时,它被假设为一个主动套接口,也就是说,它是一个将调用connect发起链接的客户套接口。函数listen将未链接的套接口转换成被动套接口,告诉内核应接受指向此套接口的链接请求。根据TCP状态转移图,函数listen导致套接口状态从CLOSED转到LISTEN。
<!--[if !supportLists]-->2. <!--[endif]-->函数的第二个参数规定了内核为此套接口排队的最大链接个数。
一般而言,此函数应该在 socket 和 bind 之后,调用函数 accept 之前调用。
参数 backlog 的解析:
对于给定的监听套接口 (listen 之后 ) ,内核要维护两个队列:一个是处于三次握手过程中(即客户端调用 connect ,服务器端收到 SYN ,并返回 ACK 和 SYN 后,在等待客户端的 ACK ),处于 SYN_RCVD 状态;另一个是从 connect 成功,处于 ESTABLISHED 状态。
两个队列之和不能超过 backlog 。
5.5 accept 函数
Accept 函数由 TCP 服务器调用,从已完成连接队列头返回一个已完成的链接。若已完成队列为空,则进程睡眠(假定套接口为缺省的阻塞方式)。用于使服务器等待来自某客户进程的实际连接。
参数 cliaddr 和 addrlen 用来返回链接对方进程(客户端)的协议地址。
若函数成功返回,返回值是一个由内核自动生成的全新的描述字,代表与客户端的链接。当我们讨论函数 accept 时,常把它的第一个参数称为监听套接口描述字(由 socket 生成的描述字);把它的返回值称为已连接套接口描述字。
6 Reference
补上参考书目及一些好文章
1. Windows Sockets 网络程序设计大全
适合于WinSock编程入门。
2. Unix Networking Programming 3rd ed
很经典的书呀,如果你学习Unix Socket编程,你必须买的,学习WinSock也有作用的,因为WinSock是参考的Unix Socket。
3. Windows网络编程技术
讲了Win2000下的WinSock编程,讲了TCP/IP, Netbios, IPX/SPX, ATM等在Windows下的编程,有很多代码,还有一个MS Platform SDK的东西,这可是很难得的。对了,还有QoS和Raw Socket编程的程序例子。
发表评论
-
linux网络流量监控工具: iftop
2011-04-17 18:46 1065主页:http://www.ex-parrot.com ... -
建立NFS共享
2011-04-17 18:41 783服务端: 修改 /etc/exports,增加共享目录 /ex ... -
巧用Linux命令完成统计排序功能
2011-03-11 16:50 874前几天碰到一个问题: ... -
linux 程序运行前后台切换
2011-03-10 21:57 1213Shell支持作用控制,有 ... -
关于linux服务器出现大量的Time_WAIT socket连接问题
2011-01-26 18:07 2254修改linux系统/etc/sysctl.conf配置来解决这 ... -
通过修改Linux服务自动启动指定应用程序(涉及运行级别)
2011-01-24 10:16 919转自:http://www.cnblogs.com/inter ... -
linux shell编程if语句内判断参数详解
2011-01-23 21:28 889shell 编程中使用到得if语句内判断参数 –b 当f ... -
【转载】配置开发支持高并发TCP连接的Linux应用程序全攻略
2010-12-15 23:46 876原文见:http://www.cppblog. ... -
命令收集(notepad)
2010-12-07 21:11 7271. grep cat app.log | grep 'ERR ... -
linux上面的sz,rz命令与ssh的配合
2010-09-10 14:16 754问题的提出: 一 ... -
apache动态加载module
2010-08-26 17:58 766From blog: http://fangrn.iteye. ... -
apt命令详解
2010-08-22 16:11 824常用的APT命令参数: apt-cache searc ... -
linux学习网址
2010-08-19 17:09 6811. http://lamp.linux.gov.cn -
jboss部署成为linux服务
2010-08-10 17:00 18281. 创建jboss用户 useradd -m jbos ... -
Shell学习
2010-08-10 14:14 7541. 如何清空一个文件 cat /dev/null &g ... -
关于网络
2010-08-05 10:41 7381. OSI七层协议 物理层,数据链路层,网络层, ... -
关于linux中环境变量的设置
2010-05-10 11:49 803at /etc/profile append the fol ... -
eclipse查看安装-dropins
2010-04-22 14:35 1558Eclipse 3.4插件安装方式 以前安 ... -
ftp命令详解
2010-04-21 16:46 987linux下ftp命令 FTP命令是Internet用户使用 ... -
find命令详解
2010-04-20 13:50 821作者:Sheryl Calish 简单 ...
相关推荐
### TCP 三次握手详解 #### 一、三次握手的基本概念 TCP(Transmission Control Protocol,传输控制协议...以上就是TCP三次握手、四次挥手及其11种状态的详细介绍。这些基础知识对于理解和分析网络通信问题至关重要。
长连接的核心在于减少连接建立与关闭的开销,因为在TCP三次握手和四次挥手过程中,会消耗一定的时间和资源。对于频繁通信的场景,如实时聊天、在线游戏、股票交易等,保持长连接可以显著提高效率。 实现Socket长...
TCP连接的建立需要经过“三次握手”,断开则需“四次挥手”。长连接就是在TCP连接建立后,不立即关闭,而是持续保持,以便随时可以进行数据传输。 创建一个简单的Socket长连接Demo,通常包括以下步骤: 1. **...
- TCP(传输控制协议)是面向连接的,提供可靠、有序且无损的数据传输,通过三次握手建立连接,四次挥手关闭连接。 - UDP(用户数据报协议)是无连接的,不保证数据的顺序或可靠性,但传输速度较快。 4. **Socket...
TCP通过三次握手建立连接,确保数据传输前双方都已经准备好。在数据传输过程中,TCP使用滑动窗口机制进行流量控制和拥塞控制,确保网络稳定。TCP连接的另一端是四次挥手来释放连接,以防止资源浪费。 HTTP是应用层...
### Socket编程基础知识点 #### 一、网络通信与Socket概念 - **Socket**:在网络通信中,Socket(套接字)是一种用于不同主机之间或同一主机上不同进程间通信的抽象概念。它允许应用程序通过网络进行通信,是TCP/...
TCP连接的建立需要三次握手,断开则需要四次挥手。 3. **心跳包设计**:心跳包通常是轻量级的数据,比如简单的字符串或者特定的字节序列,它的目的是检查连接的有效性。心跳间隔时间需要合理设置,太短会增加网络...
在TCP连接的建立过程中,通常会经历三次握手,即SYN(同步序列编号)、SYN+ACK(同步序列编号和确认)和ACK(确认)三个阶段。这个过程确保了双方都有能力接收和发送数据,防止了无效或丢失的连接请求。一旦连接建立...
在TCP协议下,Socket通信基于三次握手建立连接,通过连接完成数据传输,最后由四次挥手断开连接。在这个过程中,客户端首先发起连接请求,服务器响应并建立连接,然后双方可以进行双向数据交换。 在PHP中,创建一个...
TCP通过三次握手建立连接,并通过确认、重传机制确保数据的可靠性。Socket则是一个编程接口(API),它允许应用程序通过网络进行通信,可以基于TCP或UDP等协议。 在Delphi中,使用 Indy 或 Winsock 组件来实现TCP ...
- TCP Socket建立在TCP协议之上,它确保数据的有序、无损传输,通过三次握手建立连接,并在传输完成后通过四次挥手断开连接。 - 在欧姆龙PLC中,FINS TCP(Factory Integrated Network Protocol over TCP)是用于...
TCP建立连接需要三次握手,断开连接需要四次挥手。 2. UDP(User Datagram Protocol):无连接的协议,速度快但不保证数据的顺序和可靠性,适用于对实时性要求高的应用,如视频会议、在线游戏等。 二、Socket编程...
- 建立连接:在TCP Socket中,使用三次握手建立连接。客户端发起连接请求,服务器响应,然后客户端确认,最终形成连接。 - 数据传输:连接建立后,双方可以通过read和write函数交换数据。 - 断开连接:TCP Socket...
- 建立TCP连接需要经过三次握手:SYN(同步序列编号)、SYN+ACK(同步确认)、ACK(确认)。 - 断开连接则需要四次挥手:FIN(结束)、ACK(确认)、FIN+ACK(结束确认)、FIN(结束)。 3. **断线重连机制**: ...
- **TCP/IP协议**:传输控制协议/因特网协议,确保数据可靠传输,通过三次握手建立连接,四次挥手断开连接。 2. **创建Socket Server** - **ServerSocket类**:在Android服务器端,我们需要创建ServerSocket实例...
在建立连接时,会经历著名的三次握手过程;断开连接时,需要四次挥手。TCP Socket编程主要包括服务器端(Server)的监听、接受连接和处理请求,以及客户端(Client)的连接、发送和接收数据。 2. UDP Socket编程:...
#### 四、TCP连接的三次握手过程 TCP协议是一种面向连接的协议,它通过三次握手来确保连接的建立。三次握手的具体步骤如下: 1. **第一次握手**:客户端向服务器发送一个同步标志位(SYN)的报文段,并进入`SYN_...
它在建立连接前会进行三次握手,并在数据传输完成后通过四次挥手断开连接,确保数据的完整性和顺序性。 2. **Java Socket类** Java的`java.net.Socket`类代表TCP连接的一端,它提供了创建和管理TCP连接的方法。...
- TCP是面向连接的,建立连接前需要三次握手,断开连接时需要四次挥手,确保数据的可靠性。 - UDP则是无连接的,无需建立连接即可直接发送数据,因此速度快,但不保证数据包的顺序和完整性。 - TCP适合需要稳定、...