网络通讯笔记之两台设备通过tcp通讯,都需要知道对方的ip和端口号吗?

code review!
不需要 。在标准的 TCP 通讯中,只有一方(主动发起连接的一方)需要预先知道另一方(被动等待连接的一方)的 IP 地址和端口号。
TCP 通讯通常采用客户端/服务端(Client/Server)模型,这两者的角色和对地址信息的需求是完全不同的。
- 客户端(Client - 主动方)
- 必须预先知道对方信息:客户端需要主动向服务端发送建立连接的请求(TCP 三次握手)。如果没有服务端的明确 IP 和端口,请求就无处投递。
- 自己的信息:客户端通常不需要手动指定自己的端口号。在发起连接时,客户端的操作系统会自动在后台分配一个空闲的、随机的端口(称为"临时端口"或 Ephemeral Port)。
- 服务端(Server - 被动方)
- 必须公开自己的信息:服务端需要在本地绑定(Bind)一个固定的端口,并在该端口上持续监听(Listen),让别人能够找到它。
- 不需要预先知道客户端的信息 :当客户端的数据包(SYN 包)到达服务端时,TCP 网络协议的"数据包头部"会自动携带客户端的源 IP 地址 和源端口号。服务端收到数据包后,直接像看"来电显示"一样提取出这些信息,然后利用它们将响应数据准确地发回给客户端。
- 生活中的比喻:
这就好比(客户端)打电话给一家披萨店(服务端)订餐:
- 必须预先知道披萨店的电话号码(服务端的 IP 和端口),否则无法拨号。
- 披萨店不需要提前知道电话号码。当电话打通时,披萨店的座机上会显示来电号码(数据包中自带的源 IP 和源端口)。即使中途挂断,披萨店也能根据这个来电号码把电话回拨给。
-
总结来说
服务端只负责"开门迎客"(暴露 IP:端口并监听),客户端负责"敲门"(主动连接) 。这就是 TCP 最经典、最简单、最常用的方式。两台设备进行 TCP 通讯前,必须先确定好谁做服务端(负责监听),谁做客户端(负责连接)。只有客户端需要提前知道服务端的 IP 和端口。
在标准的 TCP 客户端-服务器模型下,只需服务端暴露自己的 IP 和端口,客户端主动来连接就可以了。服务端不需要事先知道任何客户端的 IP 或端口。
-
实际中需要注意的几点:
- 公网环境:如果服务端在公网,客户端能直接连;如果服务端在内网(家里/公司),需要端口映射(路由器 NAT)或使用公网穿透工具(如 frp、ngrok、ZeroTier)。
- 防火墙:服务端必须把该端口放行(Windows 防火墙、Linux ufw/firewalld、云服务器安全组)。
- IP 变化:动态 IP 的话,建议用域名(DDNS)而不是裸 IP。
- 安全:生产环境推荐加 TLS(wss)、认证、限 IP 等,不要直接裸 TCP 暴露。