防火墙只开放80端口,为了使TCP包和UDP 包通过防火墙,因此可选择如下方案: 
  在A机器上起一个tunnel的client端,让它侦听本机的一个不被使用的任意指定端口,如1234,同时将来自1234端口上的数据指引到远端(B机)的80端口上(注重,是80端口,防火墙答应通过),然后在B机上起一个server,同样挂接在80端口上,同时指引80端口的来自client的转发到本机的telnet服务端口23,这样就ok了。现在在A机上telnet本机端口1234,根据刚才的设置数据包会被转发到目标端口为80的B机,因为防火墙答应通过80端口的数据,因此数据包畅通的穿过防火墙,到达B机。此时B机在80端口侦听的进程收到来自A的数据包,会将数据包还原,再交还给telnet进程。当数据包需要由B到A返回时,将由80端口再回送,同样可以顺利的通过防火墙。  问题是:
 A机器向B机器发起连接的数据流:
  A.sock_connect-->A.1234-->B.80-->B.23  A机器向B机器传送的数据流:
 A.sock_connect-->A.1234-->B.80-->B.23  B机器对A机器发起连接的响应数据流: B.23-->B.80-->A.1234-->A.sock_connect
   B机器向A机器传送的数据流:
 B.23-->B.80-->A.1234-->A.sock_connect 请问连接和数据经过的端口对么?如果是这样,那么侦听连接的端口同时也能传送数据 么?侦听连接的端口不会另外accept一个端口么?

解决方案 »

  1.   

    accept的端口会和listen的一样,都是80端口
      

  2.   

    ahao:
     
     你说的 accept端口和listen都是80端口是什么意思?accept应该会创建一个新的端口啊是不是这个意思:
    所谓accept函数,其实抽象的是TCP的连接建立过程。accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。所以,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!而同时,放火墙的对IP包的处理规则也是清晰明了,不存在前面设想的种种复杂的情形。所以说在TCP包中,封装的端口号仍然是80啊。
      

  3.   

    你的理解是对的,源ip,port和目的ip,port,4个值确定一个连接
    只要其中一个不同就可以。
    所以你不用担心,服务器端口相同