最后更新:2021-12-05 13:18:10 手机定位技术交流文章
TCP操作分为三个步骤:1. Connect;2. Transfer data;和3. Disconnect。
TCP/IP网络用于连接服务器和客户的三种握手程序,即客户和服务器在实际数据传输程序开始前交换同步和确认包的三步程序。
三个握手流程的用意是让两端能够帮助您同时启动进程、谈判和分离 TCP 连接。 它允许您以两种方式发送许多 TCP 套接字连接 。
消息类型 |
描述 |
Syn |
开始建立连接, 帮助您同步各个设备的序列号 。 |
ACK |
向对方证明SYN已经收到是有用的 |
SYN-ACK |
本地设备和先前的数据集发送的 SYN 信件的 ACK |
FIN |
用于终止连接 |

TCP已经握过三次手。 客户必须在会议开始时请求在握手期间与服务器进行沟通 :
一. 客户端与服务器建立连接,与SYN传输数据段,并通知服务器客户已开始通信,其序列号是什么。
二. 服务器使用本阶段设置的SYN-ACK信号对客户请求作出答复。SYN表示,它应该能够在段落开头使用序列号,而ACK帮助你对收到的段落表示答案。
三. 客户在现阶段验证服务器的答案,它们都建立了坚实的连接,以启动真正的数据传输程序。

以上是三步握手程序的简单例子,包括三个步骤:
Socket serverSocket(/clientSocket) = new Socket(AddressFamily.InterNetWork,SocketType.Stream,ProtocolType.Tcp);
客户端: Bind () 函数用于绑定 IPEndPoint 对象( 为 IPEndPoint 示例指定IP 地址和端口组合) 。
1.定义侦听端口:
IPEndPoint ipEnd = new IPEndPoint(IPAdress.Parse(ip),port);
服务器的 IP 地址用字母 IP 表示 。
端口:服务器的自定义端口号 。
二. IPEndPoint 连接到插座 :
serverSocket.Bind(ipEnd);
客户端 : 使用 连接 () 函数发送连接请求, 使用 IP 和 服务端口号 。
String serverIp=”196.168.0.1.1”;
Int serverPort=5580;
IpEndPoint serveripEndPoint=new IpEndPoint(IPAdress.Parse(serverIp), serverPort);
clientSocket.Connect(serveripEndPoint);
ServerIp: 服务器IP 地址
server端口:服务器的自定义端口号 。
服务器: 使用监听来开始收听所有发送到服务器的连接请求; 不需要客户端 。
int backlog=100;
serverSocket.Listen(backlog);
托盘: 可以排队接受的连接数量, 即挂起的连接队列的最大长度
前置代码:
Socket 发件人Connect = serverSocket.Acception () ; 获得服务用户连接
创建大小为 1024*1024 字节的内存缓冲, 即 1M 的内存缓冲
Byte[] arrServerRecMsg=new byte[1024*1024];
在将可接受的数据存入记录和档案管理缓冲区后,返回到字节数组长度。
Int Length= serverConnect.Receive(arrServerRecMsg);
将机器接受的字节数组转换为可读字符串。
String strSRecMsg=Encoding.UTF8.GetString(arrServerRecMsg,0,Length);
String msg=””;
serverConnect.Send(Encoding.UTF8.GetBytes(msg));
建立1M记忆缓冲区,临时储存收到的信息。
Byte[] arrRecvmsg=new byte[1024*1024];
从客户收到的信息被存入记录和档案管理缓冲区。
Int Length= clientSocket.Receive(arrRecvmsg);
从客户端接收的数据转换成 UTF-8 协议字符串 。
Stirng strRevMsg=Encoding.UTF8.GetString(arrRecvmsg,0, Length);
将字符串输入转换为字节数组( 字节[ ] )。
String ClientSendMsg=””;
byte[] arrClientSenMsg=Encoding.UTF8.GetBytes(ClientSendMsg);
客户端
客户端发送字节数组
clientSocket.Send(arrClientSenMsg);
一. 当许多客户要求与服务联系时,不同客户如何发现不同客户之间的联系?
回答1:连接由一个四组小组来区分,由源和目标iprt以及源与目标IP地址组成。因此,如果两台不同的机器连接到第三台机器的同一个港口,则由于源IP不同,有两种不同的连接。如果同一台机器(或NT背后的两台计算机或共用同一IP地址的计算机)两次连接到一个遥远的端口,则该连接由源 Po 区分。
简言之,如果我从我的客户端连接到同一个网络服务器两次,这两个连接就会从网络服务器中分离出源端和目标端口。 这确保了没有误解,即使这两个链接有相同的源代码和目标IP地址。
端口是一种多路复用除非应用程序定义了它自己的更高级别的协议,否则无法再利用该端口。 如果使用同一协议的两个连接具有相同的源码和目标IP以及同一源码和目标端口,它们必须是相同的连接。
回答2:
首先,铭记以下两项准则:
示例1:连接到同一个服务器端口的两个客户意味着: switch1 SRC-A, 100, DEST-X, 80, TCP 和 socket2 SRC-B, 100, DEST-X, 80, TCP。 这意味着主机A 连接到服务器 X 端口 80, 主机B 连接到服务器 X 端口 80 : 连接到服务器 X 端口 1: 连接到同一个服务器端口的两个客户 : sock1 SRC-A, 100, DEST-X 和 sock2 SRC-B, 100, DEST-X, 80, TCP。 这意味着主机A 连接到服务器 X 端口 80, 主机B 也连接到服务器 X 的端口 80 。 服务器对两组的处理方式现在取决于它是单线还是多线(我稍后解释) 。关键是服务器可以同时倾听多个端口。
要回答原始问题:
无论存在状态协议还是状态协议,两个客户都可以连接到同一个服务器端口,因为我们可以给每个客户口分配不同的合成(因为客户 IP 无疑会不同 ) 。 同一个客户端也可以连接两组到同一个服务器端口 — — 因为他们有 SRC- port 。
答案的第二部分是服务器如何知道要回答哪个软件包。 首先, 应该理解的是, 同一端口的单个服务器程序可能存在多重合成( 可能来自同一客户端或不同的客户端) 。 现在, 只要服务器知道哪个请求与哪个请求相连, 它总是可以用相同的组合对合适的客户端做出回应。 因此, 除了客户最初试图连接的初始端口之外, 服务器从不需要在自己的节点打开另一个端口。 如果任何服务器在连接后分配不同的服务器端口, 那么在我看来服务器正在浪费它的资源, 并且它必须要求客户重新连接到指定的新端口 。
为完整性多一点:
例2: 考虑下面的问题:“ 服务器上两个单独的程序能否监听同一个端口?” “ 如果您不将协议视为定义软件包的参数之一, 答案是否定的 。 这是因为我们可以说, 在此情况下, 一个客户将没有任何机制可以连接到服务器端口, 以提及客户想要连接的两个监听程序中的哪一个。 这与规则(2)中的说法是相同的主题。 但是, 答案是错误的, 因为“ 协议” 也是处理定义的一部分。 因此, 只有在使用不同的协议时, 同一个节点的两个程序才能检测到同一个端口 。 例如, 两个不相关的客户( 例如, 一个使用 TCP, 另一个使用 UDP ) 可以连接和通信到同一个服务器节点和同一个端口, 但是它们必须由两个不同的服务器程序提供服务 。
个人和多种服务器类型:
当服务器进程在端口倾听时, 许多数据集可以同时连接到同一个服务器进程并与同一服务器进程互动。 如果服务器仅使用一个子进程来为所有套接字组提供服务, 服务器被称为单一程序/ 线服务器, 如果服务器使用多个子进程来为子进程提供每个输入的服务, 服务器被称为多程序进程/ 线服务器 。
2.TCP/HTTP监听端口:如何在许多用户之间共享一个单一端口
必须明白三件事:
1) 服务器上正在运行一个进程 。监听一旦连接到一个端口, 就会传到另一条线上。 通信永远不会接管监听端口 。
由操作系统连接,操作系统由以下5个阵列(本地IP、本地端口、边远IP、边远端端口、协议)独特识别。如果阵列中的任何元素不同,连接是完全独立的。
(三) 当客户客户与服务器建立连接时,它将随机选择一个未使用的高阶源端口因此,一个客户可以拥有多达64k个客户连接到服务器上同一目标端口。
二、服务与多个客户沟通时,如何选择客户?
您如何在 II. TCP 通讯中处理粘贴数据包并将其拆包?
...
其余问题将在后续案文中处理。
本文由 在线网速测试 整理编辑,转载请注明出处。