TCP / IP基础:目标端口相关性
收藏

好吧,这有点让人难堪,但我有一个相当“noob”的问题。
在客户机-服务器TCP通信中,我的系统是一个访问远程服务器的客户机,比如说端口XX,客户机不是在其系统中打开一个随机端口YY来与远程端口XX通信吗?
所以当我们编码时,我们确实指定了目标端口xx,对吗?
对于客户端,端口yy本身是在创建套接字时选择的,不是吗?
我是否可以监视/限制/控制任何与特定服务器通信的客户端?(比如说客户机在特定的服务端口与服务器对话??)
是否有任何iptable规则或防火墙规则限制客户端?
这能做到吗?是吗?
目标端口是否保存在套接字结构中?如果是,在哪里?是吗?
谢谢!


最佳答案:

首先,服务器端用socket(2)bind(2)listen(2)调用链创建侦听套接字,然后用accept(2)调用等待传入的客户端连接请求。一旦客户端连接(socket(2)然后在客户端connect(2)并且客户端和服务器机器的tcp/ip堆栈完成three way handshake,则accept(2)返回新的套接字描述符-即连接的套接字的服务器端。服务器端的bind(2)和客户端的connect(2)都接受服务器的地址和端口。
现在,完整的TCP连接由四个数字描述—服务器地址、服务器端口、客户端地址和客户端端口。在尝试连接之前,前两个显然必须为客户端所知(否则,我们该去哪里?)。客户端地址和端口虽然可以用bind(2)显式指定,但通常是动态分配的-该地址是由routing table确定的传出网络接口的IP地址,并且所选端口超出ephemeral ports的范围。
netstat(8)命令显示已建立的连接。添加-a标志可以让您看到监听套接字,-n标志禁用dns和服务解析,所以您只看到数字地址和端口。
linuxiptables(8)允许您限制允许客户端连接到的位置。您可以基于源和目标端口、地址等进行限制。
您可以使用getsockname(2)调用获取套接字本地绑定,远程绑定由getpeername(2)提供。
希望这能更清楚一点。

    公众号
    关注公众号订阅更多技术干货!