TCP通信是双向通信吗?

6

这实际上是关于TCP通信的一个新手问题。

TCP通信是否是双向通信?

让我们来看一个场景: 一个程序正在监听TCP端口,比如端口25。外部程序使用随机的出站端口,比如端口45000,连接到第一个程序的IP地址(端口25).

由于第一个程序只是在监听,那么这是否意味着

  1. 第一个程序只能接收数据而无法通过端口25发送任何数据?
  2. 如果可以发送数据,那么是什么保护第二台计算机的出站端口45000免受第一个程序通过端口25的恶意攻击?据我所知,防火墙只用于入站端口。

非常感谢任何回复。

1个回答

8
TCP始终是双向的,没有像UDP那样的“发送并忘记”。第一个程序必须打开服务器套接字(Server Socket)。这意味着,它会监听端口25以获取TCP SYN(一种信号,表示正在打开连接)。如果您的第二个程序从端口45000连接到端口25,该连接将由4个值标识:您主机的IP、您主机的端口、远程主机的IP和远程主机的端口。在进行三次握手(SYN、SYN ACK、ACK)的时候,第一个程序将从服务器套接字返回一个客户端套接字,该套接字已连接到第二个程序。因此,在连接建立后,它是双向通信,同时也存在漏洞。
防火墙大多数情况下会阻止入站流量。如果第一个程序位于防火墙后,并且未正确配置防火墙,则防火墙将放弃来自第二个程序的SYN数据包。连接不会建立。防火墙还可以检查出站连接,如果正确配置。
正如我所说。一旦连接到远程程序,远程程序就像本地程序一样获得了客户端套接字,通过该套接字进行所有通信。

谢谢您的解释...这是否意味着连接的客户端会有漏洞?这就是为什么当我们浏览某些网站(端口80)时,有时会收到来自Google的恶意警告,不要访问该网站的原因吗? - user1034912
1
啊,是的和不是的。如果您在80端口连接到谷歌,谷歌Web服务器将接受您的客户端。然后,服务器程序返回一个客户端套接字,该套接字连接到您的浏览器客户端套接字。然后,您的浏览器通过连接发送“GET / HTTP/1.1”HTTP数据包,该数据包由谷歌方面读取。谷歌然后获取他们的网站并将其发送给您。现在是恶意攻击可能发挥作用的时候了。有多个向量可以被攻击。有人可能劫持您的TCP连接,还有人可能会将恶意流量注入到谷歌网站(JavaScript)中。 - Stellarator
1
我认为你的意思是那些显示红色横幅,谷歌告诉你不要去的网站。不,这些网站并没有利用TCP连接。你连接到那里,他们通过TCP连接向你发送恶意内容。你访问该网站,执行HTTP的GET部分,网站会响应恶意代码。TCP从未受到攻击,但是你的浏览器解析整个事务(HTTP部分),以便能够呈现网站,因此它受到攻击。 - Stellarator
再次感谢,您的解释非常好。那么TCP是否可能通过您的出站端口受到攻击?如果是,我们如何保护我们的出站端口? - user1034912
1
TCP 实际上从未受到攻击。大多数情况下,TCP 栈是由恶意构造的数据包损坏的结构。只要客户端套接字有目标可连接(例如 Google),就没什么问题。只有 Google 才能发送给您恶意代码。只要您的操作系统正确处理 TCP 数据包,就没有真正的担忧。防火墙如诺顿、Ashampoo 或卡巴斯基也可以很好地保护您的机器免受入站连接的影响。如果您在 NAT 路由器后面,则不存在入站连接,只有向您请求的网站的出站连接。 - Stellarator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接