V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
plan9
V2EX  ›  奇思妙想

关于某墙的端口封锁

  •  
  •   plan9 · 2012-12-22 20:57:52 +08:00 · 11447 次点击
    这是一个创建于 4373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近看到好多人发帖说到墙会封锁端口,个人感觉这个端口应该不是墙干的,而是你的服务商干的

    因为好多服务商提供给你的都是一个局域网的ip,而公网ip是由好多人共有的,但是一个ip只能有6万多个端口,所以如果你长时间使用某个端口的,可能会被你的服务商切断连接,或者你所在的ip已经使用了超过单个ip最大端口数也会被切断连接

    判断是否是这种原因的话很简单,过一段时间再连接同样的端口试试,如果可以连接的话应该就是这个问题

    比如你用浏览器去下载一下大文件,经常出现下着下着就断了的情况,这种情况也有很大原因是你使用的是局域网ip

    而对于最近这次墙的升级,个人感觉改用udp的openvpn应该会有一定的作用,不过这个我没试过,不知道是否准确,大家被封的vpn都是什么类型的?
    74 条回复    1970-01-01 08:00:00 +08:00
    lwjefSub
        1
    lwjefSub  
       2012-12-22 21:04:27 +08:00
    不对,就算不独立端口也不是独占的,再说分明都有独立IP。
    cabbala
        2
    cabbala  
       2012-12-22 21:06:36 +08:00
    你是说一个局域网只能并发60000+ 噗
    ericFork
        3
    ericFork  
       2012-12-22 21:07:33 +08:00
    可惜事情不是你感觉的这个样子的……

    1. 作为代理服务商,大量事实证明,并非端口占用导致的……

    2. UDP 的 OpenVPN 封得更惨……
    cabbala
        4
    cabbala  
       2012-12-22 21:14:11 +08:00
    Q:单IP做NAT能支持多少并发连接呢?
    A:65535

    这个答案是错的
    hemingway
        5
    hemingway  
       2012-12-22 21:16:15 +08:00
    学习了
    plan9
        6
    plan9  
    OP
       2012-12-22 21:18:46 +08:00
    @lwjefSub 大多数都不是公共ip吧

    @cabbala 不要噗...这个很伤人的...而且理论上是6万个TCP连接啊

    @ericFork 我说的不是vpn被封,而是有人反映端口被封,但是换个端口就可以继续使用了,感觉这个有很大可能是我说的原因,至于udp的也被封的很惨就是我猜测的错误了...
    cabbala
        7
    cabbala  
       2012-12-22 21:31:12 +08:00
    @plan9 真的不是,否则NAT网络很悲剧的,你应该看下NAT原理。

    只有在NAT网络中的所有机器用同样的协议访问同一个IP的同一个端口时,最大连接数是6w。。。
    terry0824
        8
    terry0824  
       2012-12-22 21:33:53 +08:00
    @plan9 至少据我所知北京联通ADSL都是公共IP。
    clino
        9
    clino  
       2012-12-22 21:36:42 +08:00
    sinxccc
        10
    sinxccc  
       2012-12-22 21:43:33 +08:00
    楼主的大部分猜想是没什么技术根据的,不过第一句部分是对的。

    运营商确实有封端口的行为,只不过运营商封锁端口的话,是这个端口根本就无法使用,行为跟墙不一样,很容易区分。

    比如说大部分运营商会封锁80端口的上传,部分运营商一段时间内封锁过 PPTP 的端口。
    cabbala
        11
    cabbala  
       2012-12-22 21:43:38 +08:00   ❤️ 1
    NAT的问题,lz我举个例子吧

    假如NAT下有两台机器 192.168.0.2 192.168.0.3
    他们分别从源端口8888访问不同的主机1.1.1.2和1.1.1.3的88端口

    lz你觉得这两个链接是互斥的么?实际不是的。因为识别一个包有五要素:
    源地址,源端口,目的地址,目的端口,协议

    在这个例子中,NAT做地址转换只是将源地址修改为NAT的对外IP,那么在这个例子中,源地址,源端口,目的端口和协议这四项两个包都是一样的,但是由于目的地址不一样,所以两个包是可以区分的,不互斥。。
    plan9
        12
    plan9  
    OP
       2012-12-22 21:57:30 +08:00
    @cabbala
    192.168.0.2 192.168.0.3 公网ip是1.1.1.1

    他们发出去的包
    192.168.0.2源地址1.1.1.1,源端口8888,目的地址1.1.1.2,目的端口88,协议tcp
    192.168.0.3源地址1.1.1.1,源端口8888,目的地址1.1.1.3,目的端口88,协议tcp

    那样的话不是就变成了1.1.1.1跟1.1.1.2建立连接,1.1.1.1跟1.1.1.3建立连接
    然后就是1.1.1.1转发给0.2,0.3

    他们不是应该使用两个端口吗?

    我nat确实不大懂...这样理解错在什么地方啊?
    plan9
        13
    plan9  
    OP
       2012-12-22 22:44:16 +08:00
    @cabbala @sinxccc
    找到技术根据了,
    google了一下,确实nat只能理论支持最大同时65535个连接数
    原文在这里http://itpro.nikkeibp.co.jp/article/COLUMN/20090525/330579/
    不过是日文的

    linux确实可以通过修改文件描述符增加,不过一般没有人改这个东西吧
    cabbala
        14
    cabbala  
       2012-12-22 23:26:28 +08:00
    @plan9 你知道一个大型NAT网络有多少用户么,有多少连接么。。

    以我们以前的学校为例,最少有几千用户同时在线,而出口只有三个IP。每个用户一般得近百连接,开P2P上千也很正常

    要是最大65535并发连接,那这个网络还怎么用?

    你Google的方法不对,重新Google吧。。。网上中文的最少有三篇,英文的不计其数。。。
    cabbala
        15
    cabbala  
       2012-12-22 23:44:59 +08:00
    其实这个问题可以换成下面的问题:

    一台http服务器只有一个80端口,为什么可以同时和多台client同时通信?

    lz想明白这个问题,就能想明白上面的问题了。
    clino
        16
    clino  
       2012-12-22 23:47:58 +08:00
    @plan9 对nat没仔细研究过,刚看了 http://baike.baidu.com/view/16102.htm 里的'NAT工作流程',对你的疑问"他们不是应该使用两个端口吗?"的解答应该是在外界看来,这两个连接确实是从1.1.1.1的同一个端口发出的,但是1.1.1.1收到两个连接的包确实可以分别送回内网不同的ip,因为之前"NAT 主机并且会记忆这个联机的封包是由哪一个client 端传送来的"
    plan9
        17
    plan9  
    OP
       2012-12-23 00:15:25 +08:00
    @cabbala
    所以说大型nat网络经常会出现连接中断的问题啊
    那你们以前学校为什么几千个用户就用3个ip,一个不就行了?

    http://www.360doc.com/content/07/0816/17/26398_676992.shtml
    http://wenku.baidu.com/view/36bedf40336c1eb91a375dca.html
    https://www.cpug.org/forums/nat-network-address-translation/6013-number-connections-behind-hide-nat.html

    一台http服务器只有一个80端口,为什么可以同时和多台client同时通信?
    这个我可以很确定的告诉你,80端口只是连接的时候使用,然后服务器会新开一个端口跟客户端进行通信

    @clino
    1.1.1.1跟两台机器进行通信的话肯定会使用2个端口的,当然这里的端口只是文件描述符,你不可能一个端口同时跟两台机器进行通信把?
    wwwjfy
        18
    wwwjfy  
       2012-12-23 00:40:54 +08:00
    查了一下没找到1个ip是否可以有超过65535个端口,虽然我猜对于路由这种配置不会太难

    问题是如果端口已经用完,应该是移到下一个可用的ip,或者新连接无法建立吧,不觉得应该切断已有连接

    过段时间连接同样端口成功就认为是这样的原因也比较武断,可能性不止这一种。至少GFW可能封一段时间会解封,比如访问google就是这样

    另外,除非有什么特殊事件,用户不会一下子猛增,运营商应该有这种准备,应该会有好多备用ip,而且工作着的ip也不应该是满负荷的..
    binux
        19
    binux  
       2012-12-23 00:45:34 +08:00
    @plan9
    192.168.0.2源地址1.1.1.1,源端口8888,目的地址1.1.1.2,目的端口88,协议tcp
    192.168.0.3源地址1.1.1.1,源端口8888,目的地址1.1.1.3,目的端口88,协议tcp

    首先,只有192.168.0.2/3能发起到1.1.1.2/3的请求。
    现在192.168.0.2/3开始发包,它各自声明目的地是1.1.1.2/3:88,ok,没问题
    现在1.1.1.2/3开始返回,因为它看不见192.168.0.2/3,它只能发往1.1.1.1:8888

    问题来了,1.1.1.1怎么知道应该把1.1.1.2/3的两个包发给谁
    很简单,因为1.1.1.1知道192.168.0.2发起的是到1.1.1.2:8888的连接,那1.1.1.2:8888返回的包肯定是给192.168.0.2
    over
    wwwjfy
        20
    wwwjfy  
       2012-12-23 00:50:07 +08:00
    @binux 那如果目的地址一样呢..
    plan9
        21
    plan9  
    OP
       2012-12-23 00:58:25 +08:00
    @wwwjfy
    >>查了一下没找到1个ip是否可以有超过65535个端口,虽然我猜对于路由这种配置不会太难
    嗯,我也没有找到很多资料
    不过找到了这个
    http://wenku.baidu.com/view/36bedf40336c1eb91a375dca.html
    貌似是Cisco的某款路由器的设置文档,nat的最大tcp连接数可以0到65535之间可以自由设置

    >>问题是如果端口已经用完,应该是移到下一个可用的ip,或者新连接无法建立吧,不觉得应该切断已有连接
    这个我也不懂...感觉运营商可能会切断长时间占用的连接

    >>过段时间连接同样端口成功就认为是这样的原因也比较武断,可能性不止这一种。至少GFW可能封一段时间会解封,比如访问google就是这样
    这个我道没有考虑到,是有点武断

    >>另外,除非有什么特殊事件,用户不会一下子猛增,运营商应该有这种准备,应该会有好多备用ip,而且工作着的ip也不应该是满负荷的..
    现在可用ip越来越少了,用户越来越多,运营商应该会给每个ip分配固定的用户吧,感觉有很大可能连接数会超过限制
    plan9
        22
    plan9  
    OP
       2012-12-23 01:09:32 +08:00
    @binux
    @wwwjfy
    写错了...
    源地址1.1.1.1,源端口8888,目的地址1.1.1.2,目的端口88,协议tcp
    之前已经用了8888这个端口了,所以下次发包会换一个端口
    源地址1.1.1.1,源端口8889,目的地址1.1.1.3,目的端口88,协议tcp
    Kymair
        23
    Kymair  
       2012-12-23 01:56:16 +08:00
    @plan9 在NAT的问题的更正确一些,楼上几位同学有点想当然了。

    @cabbala “NAT做地址转换只是将源地址修改为NAT的对外IP”, 如果NAT只是做这一件事情,那么
    两个clients都通过一个NAT device访问同一个server, 那么server发回的包NAT要怎么区分哪个给A哪个给B呢? 答案是,NAT有一个port pool, 会给每个客户分配一个不同的端口,然后用状态表记录下来。

    参见http://en.wikipedia.org/wiki/NAT#Translation_of_the_Endpoint
    binux
        24
    binux  
       2012-12-23 01:57:17 +08:00
    @wwwjfy 目的地址,端口都一样,就换个端口就好了啊。但是同一个端口可以在不同的服务通信中复用。

    @plan9 如果不需要为什么要换一个端口?
    plan9
        25
    plan9  
    OP
       2012-12-23 02:10:13 +08:00 via iPhone
    @binux
    同一个端口不可以建立复数个通信的,我记得端口复用只是转发而已

    具体请参考@Kymair 的答案
    Kymair
        26
    Kymair  
       2012-12-23 02:12:55 +08:00
    10.0.0.101要打开一个网页,那么浏览器取一个可用的端口比如1001,这个包发到路由器10.0.0.1时,路由器不仅会把source IP换成自己10.0.0.1, 还会把source port 1001也换成port pool的一个可用的比如2001. 同样10.0.0.102这时也访问网络,路由器会把102的包的source IP换成10.0.0.1, source port换成port pool里的可用值比如2002.
    从server返回路由器的包,dest IP都是10.0.0.1, 这个时候就能用port是2001还是2002来识别出包是给101还是102
    cabbala
        27
    cabbala  
       2012-12-23 02:17:53 +08:00
    @Kymair 我举得例子专门挑的目标地址不同的。。。你却在说目标地址相同的情况。

    目标地址相同NAT自然会改变源端口了。但这个也推导不出65535这个所谓的NAT最大并发连接数啊

    端口是可以复用的,五要素{源地址,源端口,目的地址,目的端口,协议(TCP/UDP)}只要有一个不同就可以区分
    cabbala
        28
    cabbala  
       2012-12-23 02:19:42 +08:00
    @plan9
    「同一个端口不可以建立复数个通信的,我记得端口复用只是转发而已」

    所以说我才让你好好想想为什么一个只开放了80端口的服务器,却可以连成百上千个client。。。端口是可以复用的,那么多程序在用。。
    cabbala
        29
    cabbala  
       2012-12-23 02:22:28 +08:00
    @plan9 「这个我可以很确定的告诉你,80端口只是连接的时候使用,然后服务器会新开一个端口跟客户端进行通信」

    这个。。。。,HTTP服务器是不会多开其他端口的,你信不信我用iptables把除80外的端口全封了,我的web server照样上百并发?
    Kymair
        30
    Kymair  
       2012-12-23 02:54:14 +08:00
    @cabbala Cisco的这个网页上讲了各种NAT方式,Static NAT, Dynamic NAT, Overloading和Overlapping. 我在上面提到的是最常见的Overloading. 你可以仔细看看。
    http://www.cisco.com/en/US/tech/tk648/tk361/technologies_tech_note09186a0080094831.shtml#examples

    的确五个值有一个不同就可以区分,只不过现实中有这样的实现只是你想当然而已。NAT为了节省port去同时根据目标地址及源地址来转发,转换表会相当庞大,实现逻辑会复杂许多。当然如果你有见过这样的NAT设计,麻烦给我网址我去了解一下。
    Kymair
        31
    Kymair  
       2012-12-23 03:01:21 +08:00
    @plan9 尝试一下回答你的问题,那就是其实不管是我们的ADSL, 还是大学里的校园网,大部分都是有routable的public IP的。
    cabbala
        32
    cabbala  
       2012-12-23 03:13:32 +08:00
    @Kymair 「“NAT做地址转换只是将源地址修改为NAT的对外IP”, 如果NAT只是做这一件事情。。。」

    拜托。。不要去较真我给lz做的形象化的解释好么。说粗了较真,说细了你说的也不是全部。。

    说了这么多,我觉得我说的不清楚,lz不理解。你既然很了解。。那么正好评论下lz的这几个观点,我也学习学习:

    「因为好多服务商提供给你的都是一个局域网的ip,而公网ip是由好多人共有的,但是一个ip只能有6万多个端口,所以如果你长时间使用某个端口的,可能会被你的服务商切断连接,或者你所在的ip已经使用了超过单个ip最大端口数也会被切断连接」

    「这个我可以很确定的告诉你,80端口只是连接的时候使用,然后服务器会新开一个端口跟客户端进行通信」

    原文评论吧,别扯太多。
    cabbala
        33
    cabbala  
       2012-12-23 03:19:49 +08:00
    @Kymair 「尝试一下回答你的问题,那就是其实不管是我们的ADSL, 还是大学里的校园网,大部分都是有routable的public IP的。」

    也较下真:
    1. ADSL 看运营商,移动和原来的铁通网络,在某些地区就不是公网IP,而是在NAT里
    2. 大学校园举个反例,我的母校 南开。虽然确实给分了一些IP,但整个宿舍区的网络出口只有三个IP。。。教育网一个,电信一个,联通一个。 这种情况在国内大学不算少见,说不上大部分都有公网IP
    3. 还有大量的人上网用的小区宽带而不是ADSL,所谓的小区宽带,很多地方指的不同。我们那边基本算是去拉根光纤,分个IP,然后搞局域网。


    记得以前emule好像有做过统计,国内lowid的比例是很高的。
    cabbala
        34
    cabbala  
       2012-12-23 03:43:30 +08:00
    @Kymair 「NAT为了节省port去同时根据目标地址及源地址来转发,转换表会相当庞大,实现逻辑会复杂许多。当然如果你有见过这样的NAT设计,麻烦给我网址我去了解一下。」

    找台Linux,开启NAT,怎么开就不用说了吧。。。这个NAT就是你说的实现逻辑很复杂的那种NAT。
    cabbala
        35
    cabbala  
       2012-12-23 03:47:58 +08:00
    @Kymair 另外补充一个Linux的iptables内的NAT特性,它会尽量保持端口不变。就如我的例子中所说的那样,192.168.0.2和192.168.0.3的sport都是8888,它通过NAT转换后,端口也是8888,除非这个端口被提前用作它用。

    而不是你举得例子中的「source port换成port pool里的可用值比如2002」
    Ley
        36
    Ley  
       2012-12-23 10:30:37 +08:00
    我想求教一下,如果端口被封,该怎么办呢? 自己是通过 Linode 的 VPS 设的一个 L2TP 的 VPN ,但是从开会起,自家的长宽就再也无法连接了,而学校的铁通则一直没有问题。这种情况下,该怎么处理才好?
    Kymair
        37
    Kymair  
       2012-12-23 10:46:19 +08:00
    @cabbala 我只是想说明现实中的实现基本上是不会去按目标地址去判断的,Cisco那个网页四种NAT方式均不是这样,运营商做的NAT也不是这样。

    关于你所说的iptables的那个NAT特性,麻烦给我链接我去看一下。我想看看根据目标地址进行NAT的实现是怎样的。
    Kymair
        38
    Kymair  
       2012-12-23 11:06:55 +08:00
    @cabbala
    1. 我已经说了 _大部分_ 是有routable的IP的,并没有说_所有_。我的大学和旁边的都有。如果你需要“大多数”的数据的话,中国电信的固网宽带用户截至11月是8900万户(http://www.chinatelecom-h.com/gb/global/home.htm),而中国的宽带用户去年是1.5亿左右(http://news.sohu.com/20120412/n340313585.shtml)。

    2. emule的lowid? 即使我们用的是有公网IP的ADSL, 基本上都会用路由器共享给多人使用。 路由器的WAN是routable的IP, 但我们自己的电脑还是路由器NAT过的
    plan9
        39
    plan9  
    OP
       2012-12-23 12:13:05 +08:00
    @Kymair 多谢普及nat知识,受教了
    @cabbala
    详细跟你解释一下这个
    >>这个我可以很确定的告诉你,80端口只是连接的时候使用,然后服务器会新开一个端口跟客户端进行通信
    tcp通信的时候,根本不是你想像的那样,服务器开一个端口,然后就通过这个端口与客户端连接了.正确的是这样
    1,服务器打开80端口并进行监听,这个端口只是用来监听用的,具体通信的时候并不使用(专业术语忘记叫什么了)
    2,客户端打开一个通信用的端口,连接服务器的80端口
    3,服务器打开一个新的通信用端口,通过这个端口与客户端进行通信,这个过程防火墙是不会进行干扰的

    这个不是我瞎说的,如果我没记错的话应该是[UNIX网络编程]这本书
    http://www.amazon.cn/s/ref=nb_sb_noss_1/475-4931510-8706610?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&url=search-alias%3Daps&field-keywords=unix+network+programming

    再说一下我所理解的端口复用
    比如你通过80端口入侵了某个服务器,但是对方防火墙设置了只有80端口可以访问,这时候你会让对方服务器监听本地8000端口,然后让你的程序监听80端口,当有正常的http过来的时候,你的程序转发到本地8000端口上面,然后当你的连接过去的时候你的程序会进行某些你所想要的动作.所以说端口复用开始打开了2个端口的

    至于nat,@Kymair的解释应该是很全面了
    plan9
        40
    plan9  
    OP
       2012-12-23 12:19:25 +08:00
    @Ley
    这个不好说是运营商还是墙的问题,@wwwjfy上面已经说了我的判断比较武断
    如果是运营商的问题的话你可以断下网,重新获取一个ip试试,如果是墙的话就不知道该怎么办了
    Kymair
        41
    Kymair  
       2012-12-23 12:24:19 +08:00
    @plan9 在端口复用这个上面,@cabbala 确实是对的,你在本地做一个实验即可。

    或者参考我的结果
    https://gist.github.com/4361955
    Kymair
        42
    Kymair  
       2012-12-23 12:28:26 +08:00
    plan9
        43
    plan9  
    OP
       2012-12-23 12:31:24 +08:00
    @Kymair
    netstat显示的只是监听用端口吧?
    实际上服务器会打开一个新的端口连接的,当然这里的端口理解成文件描述符比较好
    Kymair
        44
    Kymair  
       2012-12-23 12:37:44 +08:00
    @plan9 你可以看到我是按IP grep的,除了80以外并没有新的连接产生。
    plan9
        45
    plan9  
    OP
       2012-12-23 12:49:58 +08:00
    @Kymair
    我的意思是netstat命令应该只是显示监听的端口
    比如你通过80连接服务器,然后跟服务器通信的时候会使用另外一个端口,但是netstat显示的只是你监听的端口

    上面这句话前半句有依据,后半句没有...
    clino
        46
    clino  
       2012-12-23 14:26:28 +08:00
    @plan9 "你不可能一个端口同时跟两台机器进行通信把?"这有什么不可能的?对于服务端程序来说,对于提供nat服务的ip来说都是必须具备的能力.
    Kymair
        47
    Kymair  
       2012-12-23 14:37:40 +08:00
    @plan9 不是。你可以google "single port multiple connectionss site:stackoverflow.com" 读一下那几个问题和回答。
    Kymair
        48
    Kymair  
       2012-12-23 14:48:42 +08:00
    @plan9 :-) 我觉得在谈到“连接”时很容易产生一种错觉,时常误以为真有像电话网络那样的独占连接存在,但TCP/IP是基于包的。
    IP只是为了找到对应的host, port只是为了找到对应host上的对应process. 多个client同时连接server的同一个端口是没问题的,server内部是可以用source IP, source port区分开来的。
    plan9
        49
    plan9  
    OP
       2012-12-23 15:04:06 +08:00
    @clino
    tcp通信中ip是用来区别不同机器的,而端口是来区别同一个机器的里不同服务的
    每当你连接外部的服务器的时候,系统会自动分配给你一个端口,这个端口是不重复的
    而服务端,我已经说了很多次了,通信的用端口并不是监听的端口,服务器端会打开一个新的端口来与client进行通信,而原来的监听用的端口会继续对过来的连接进行监听

    >>另外补充一个Linux的iptables内的NAT特性,它会尽量保持端口不变。就如我的例子中所说的那样,192.168.0.2和192.168.0.3的sport都是8888,它通过NAT转换后,端口也是8888,除非这个端口被提前用作它用。
    如果NAT只是将源地址替换成一个IP地址,端口保持不变的话是无法区分两个连接的,所以NAT后会修改其中一个源端口的

    根据Kymair讲的,路由会维护一个port pool,这个prot pool应该就是保证端口不重复的
    plan9
        50
    plan9  
    OP
       2012-12-23 15:17:55 +08:00
    @Kymair
    可能我说的不清楚...
    一般写tcp程序的时候
    服务端通常会
    bind(),listen(),accept(),而accept会返回一个新的文件描述符,服务器通过这个文件描述符与客户端进行通信,这就是我说的服务端会通过新的端口与客户端进行通信

    而客户端会socket(),connect(),而socket也会返回一个新的文件描述符,这也就是我说的没建立一个新的连接,都会分配一个新的端口的意思
    rankjie
        51
    rankjie  
       2012-12-23 15:21:14 +08:00
    看了此贴,我又默默抱起了我的 [数据通信与网络] ...走了...
    plan9
        52
    plan9  
    OP
       2012-12-23 15:59:13 +08:00
    @Kymair
    我理解你的意思了,你说的是不考虑这个[虚拟的连接]的情况,单纯从tcp/ip来看,只是一些包而已
    我考虑的是假想这个连接是真是存在的,而process之间正是通过这个虚拟的连接来进行通信的

    角度不一样,看待问题的方式也不一样,所以产生了分歧
    enj0y
        53
    enj0y  
       2012-12-23 17:22:49 +08:00
    楼主说得不对。想想可能么?香港、美国、日本,所有机房都这样做了?
    clino
        54
    clino  
       2012-12-23 21:03:59 +08:00
    @plan9 "通信的用端口并不是监听的端口,服务器端会打开一个新的端口来与client进行通信,而原来的监听用的端口会继续对过来的连接进行监听" 你真的确定是这样吗?实际情况是这样吗? 你这样的说法我能不能得出一个服务端ip连接的客户端不能超过65535?
    那你看看这篇"完成端口模型:并发连接数达到9.1万! " http://zhanyonhu.blog.163.com/blog/static/16186044201042055221518/
    再参考这篇 "单机最大tcp连接数" http://wanshi.iteye.com/blog/1256282

    nat服务程序和服务端程序的行为差别主要在于nat服务需要对接受和发送的包做地址替换,这部分其实我之前贴的已经解释清楚了,只是你不认真去看而已
    clino
        55
    clino  
       2012-12-23 21:06:18 +08:00
    @plan9 才看到你说的这句"而客户端会socket(),connect(),而socket也会返回一个新的文件描述符,这也就是我说的没建立一个新的连接,都会分配一个新的端口的意思"
    原来你说的文件描述符等同于"端口"啊...
    那你知道你所谓的这个"端口"的限制是多少?是65535吗?
    plan9
        56
    plan9  
    OP
       2012-12-23 22:53:44 +08:00
    @clino
    非要逼我去查书...
    UNIX网络编程 第四章第六节
    他们返回的实际上是文件描述符,但是书中写的是返回的是一个socket,每个socket都有自己的ip跟端口
    监听用的socket称作listening socket,通信用的socket称作connected socket

    而且问了一下,linux内核每次新建一个socket确实会分配一个新的端口
    clino
        57
    clino  
       2012-12-24 09:26:44 +08:00
    @plan9 "而且问了一下,linux内核每次新建一个socket确实会分配一个新的端口" 这句话依据在哪里??? 照你这么说一台 http 服务器的80端口根本不可能并发超过 65535 个客户端连接.

    那么再贴几个链接:
    http://www.cnblogs.com/Solstice/archive/2011/07/01/2095411.html

    在真实的 Linux 系统中,可以通过调整内核参数来支持上百万并发连接,具体做法见:
    http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3

    至于nat服务的实现,根本不可能使用 socket 编程接口,因为实际上nat是对tcp协议的hack
    plan9
        58
    plan9  
    OP
       2012-12-24 10:55:34 +08:00 via iPhone
    @clino 内核会分配端口跟修改内核参数可以支持65535以上兵法有矛盾吗?

    nat前面已经有人回答了,路由会维护一个port pool,也会分配端口的,我没说路由是用socket接口实现的
    clino
        59
    clino  
       2012-12-24 11:00:16 +08:00
    @plan9 另外也可以去google下 "linux kernel tuning for c500k"

    你的想法看起来也是不稀奇的,被称为"The 64k Connection Myth"

    看这段的最后一句,如果这种想法是对的,那么DDoS将会是非常容易的
    "The 64k Connection Myth

    It’s a common misconception that you can only accept 64,000 connections per IP address and the only way around it is to add more IPs. This is absolutely false.

    The misconception begins with the premise that there are only so many ephemeral ports per IP. The truth is that the limit is based on the IP pair, or said another way, the client and server IPs together. A single client IP can connect to a server IP 64,000 times and so can another client IP.

    Were this myth true it would be a significant and easy-to-exploit DDoS vector."
    clino
        60
    clino  
       2012-12-24 11:07:07 +08:00
    @plan9 "内核会分配端口跟修改内核参数可以支持65535以上兵法有矛盾吗" 你看到的内核参数修改是修改支持65535端口吗? TCP协议没有对65535这个端口上限做限制吗?你自己修改了内核参数就可以突破TCP协议的限制吗?
    plan9
        61
    plan9  
    OP
       2012-12-24 14:57:38 +08:00
    还给我定了性了。。。

    我有半句说到并发问题吗?并发是跟文件描述符等系统资源有关的,这个我知道

    http://lxr.linux.no/linux+v3.7/include/net/sock.h
    http://lxr.linux.no/linux+v3.7/net/socket.c
    看了下最新的linux内核socket实现,确实没有分配新的端口,只是建立了一个新的socket,并且新的socket的ip跟port都是跟原来的socket是一样的。分配新的端口这点的确是我说错了
    clino
        62
    clino  
       2012-12-24 15:38:15 +08:00
    @plan9 你的问题和实际情况对应起来的时候当然就是并发了,否则如果一个 tcp 连接结束以后端口自然可以回收使用了
    plan9
        63
    plan9  
    OP
       2012-12-24 15:49:23 +08:00
    @clino
    我之前的帖子说的是客户端连接服务端,客户端的端口会不够,因为客户端对每个socket都是会分配不同的端口的

    而且端口只是内核里记录的一串数字而已,这跟并发又有什么关系?真正的通信是靠文件描述符的,就算每次accept分配不同端口,只要在内核里改变端口数,照样可以超过65535,当然这样做就违反tcp协议了。
    clino
        64
    clino  
       2012-12-24 16:09:12 +08:00
    @plan9 "我之前的帖子说的是客户端连接服务端,客户端的端口会不够"这是你对于NAT最初提出的问题,这个你应该已经知道自己是错的了

    我提到并发是因为你中间提到的"linux内核每次新建一个socket确实会分配一个新的端口"这句话->可以导出服务端不可能支持>64k连接,然后我找资料来证明是可以>64k的,用来证明你这句话是乱说的,你不要又扯到之前NAT相关的问题
    plan9
        65
    plan9  
    OP
       2012-12-24 16:18:07 +08:00
    @clino
    我刚才的回复没有说到nat啊,我的意思是普通的socket客户端连接服务器的时候会分配一个新的端口

    而且刚才不也说了就算服务端也分配新的端口,更改内核也可以达到高并发,你怎么就可以导出我的意思是服务端不可能支持>64k连接

    而且我们这样在这里动不动就百万并发,估计高手看了都在笑呢,不讨论了,让这个话题打住把
    clino
        66
    clino  
       2012-12-24 16:35:57 +08:00 via Android
    @plan9 "就算服务端也分配新的端口,更改内核也可以达到高并发" 看到这句我打不住了,不过这次只要重复一下,"你自己修改了内核参数就可以突破TCP协议的限制吗?"
    binux
        67
    binux  
       2012-12-24 16:38:13 +08:00
    @plan9
    @clino 在用反证法
    socket连接,服务端分配新的端口 + 端口只有64k个 => 不可能支持>64k连接
    服务器支持>64k连接是可能的 => 服务端分配新的端口 shi 错误的

    这里和你的意思是什么没有关系
    plan9
        68
    plan9  
    OP
       2012-12-24 17:06:50 +08:00
    @clino @binux
    为什么不可以???
    端口是什么?难道端口真的是你pc上的一个口?端口只是inet_hashinfo中的一个变量而已,我生成一个socket,我自己加一个变量,不行么???

    协议是什么?只是在一个规则而已,我不遵守或者我扩充一下难道不可以么???

    ps 上面这些话小辫子更多,欢迎来抓
    plan9
        69
    plan9  
    OP
       2012-12-24 17:13:11 +08:00
    @clino
    @binux
    刚才淋了会儿雨,脾气有点冲。。。别生气。。。
    clino
        70
    clino  
       2012-12-24 17:17:50 +08:00
    @plan9 可以,不过那就是你自家的私有协议了,和其他的支持TCP协议的设备就不能通讯了,为什么TCP端口会有这个限制?因为TCP HEADER 前面留给端口的只有16位

    你要把它改成24位还是32位随便啦,不过别的设备就识别不了你的TCP包了
    plan9
        71
    plan9  
    OP
       2012-12-24 17:28:32 +08:00
    @clino
    可以兼容的,比如连接80端口的时候,每次生成connected socket的时候多分配一个新的65535以上端口,这个新分配的端口什么也不干,就是为了说明这个端口大于tcp规定的端口,那么就算我每个socket都分配一个端口并发数也是可以超过65535的

    可能这个例子也不恰当,我只是想通过这个例子说明并发只是跟系统资源有关的
    binux
        72
    binux  
       2012-12-24 17:31:31 +08:00
    @plan9 端口是要告诉别人才能跟你通行的吧,你分配一个大于65535的端口,谁能和你通信呢?
    plan9
        73
    plan9  
    OP
       2012-12-24 17:35:34 +08:00
    @binux
    谁都不通。。。所以我说这个例子不恰当。。。
    test0077
        74
    test0077  
       2014-02-14 14:38:35 +08:00
    忍不住说一句,你们会抓包吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1063 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 18:23 · PVG 02:23 · LAX 10:23 · JFK 13:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.