TCP server 为什么一个端口可以建立多个连接?
2017-06-12 17:33
1071 查看
https://segmentfault.com/q/1010000003101541
如果是tcp client用同一个本地端口去连不同的两个服务器ip,连第二个时就会提示端口已被占用。但服务器的监听端口,可以accept多次,建立多个socket;我的问题是服务器一个端口为什么能建立多个连接而客户端却不行呢?
2015年08月16日提问
评论
邀请回答
编辑
更多
默认排序时间排序
已采纳
TCP server 可以,TCP client 也可以。一个套接字只能建立一个连接,无论对于 server 还是 client。
注意报错消息是:
[Errno 106] (EISCONN) Transport endpoint is already connected
man 2 connect 说得很清楚了:
Generally, connection-based protocol sockets may successfully connect() only once; connectionless protocol sockets may use connect() multiple times to change their association.
就是说,TCP 套接字最多只能调用 connect 一次。那么,你的监听套接字调用 connect 了几次?
来点有意思的。
一个套接字不能连接两次,并不代表一个本地地址不能用两次,看!*加粗文字加粗文字*
你们这些有女友的都弱爆了啦 :-(
更新:大家来玩 TCP: 一个人也可以建立 TCP 连接呢 - 依云's Blog
2015年08月19日回答 · 3月9日更新
9 评论
编辑
依云22.9k 声望
答案对人有帮助,有参考价值2答案没帮助,是错误的答案,答非所问
内核是以一个(著名的)5元信息组来标识不同的socket的:源地址、源端口、目的地址、目的端口、协议号。任何一个不同,都不叫“同一个socket”。
2015年08月20日回答
评论
编辑
sched_yield105 声望
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
首先,TCP链接是可靠的端对端的链接,每个TCP链接由4个要素组成:2组IP地址(本地和远端),2组端口地址(本地和远端)。其中如果需要跟端口信息绑定时,都需要调用bind函数,如果server端针对2个同样的IP、端口组进行同样的绑定时,第2次同样是不成功的。
2015年08月16日回答
评论
编辑
charliecui2.4k 声望
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
有个相关的问题: ftp的数据传输,服务器会用20端口主动连接客户端,如果两个客户端同时在一下载东西,那ftp 服务器能用20端口去连接两个ip ?(这时ftp的服务器其实是tcp里的客户端)
2015年08月16日回答
3 评论
编辑
hyanleo173 声望
1
能啊,看我的实验。
— 依云 · 2015年08月19日
展开评论
答案对人有帮助,有参考价值-1答案没帮助,是错误的答案,答非所问
不管是服务器还是客户端,建立TCP链接,同一个端口都只能使用一次。
这句话其实是**错的**!
对于TCP协议,要成功建立一个新的链接,需要保证新链接四个要素组合体的唯一性:客户端的IP、客户端的port、服务器端的IP、服务器端的port。也就是说,服务器端的同一个IP和port,可以和同一个客户端的多个不同端口成功建立多个TCP链接(与多个不同的客户端当然也可以),只要保证【Server IP + Server Port + Client IP + Client Port】这个组合唯一不重复即可。
上述结果
**客户端**发送TCP链接请求的端口,也就是后续建立TCP链接使用的端口,所以一旦TCP链接建立,端口就被占用,无法再建立第二个链接。
而**服务器端**有两类端口:侦听端口 和 后续建立TCP链接的端口。其中侦听端口只负责侦听客户端发送来的TCP链接请求,不用作建立TCP链接使用,一旦侦听到有客户端发送TCP链接请求,就分配一个端口(一般随机分配,且不会重复)用于建立TCP链接,而不是所说的
上述描述也比较片面,客户端如何请求及建立链接,服务器端如何侦听及是否分配新随机端口等...应该都可以在应用层面进行控制,所以上述描述可以作为建立TCP链接的一种方式,仅供参考。
一些英文的参考:
How do multiple clients connect simultaneously to one port, say 80, on a server?
TCP : two different sockets sharing a port?
2015年08月16日回答 · 2015年08月19日更新
9 评论
编辑
sam_wen12 声望
2
如果真是这样,为什么netstat 命令只看到监听端口而没有你说的另一个随机端口?
— hyanleo · 2015年08月16日
2
accept 才不会分配新端口号,不然大家不用考虑单机的 C10K 问题了,反正端口号不够用不是?
— 依云 · 2015年08月19日
如果是tcp client用同一个本地端口去连不同的两个服务器ip,连第二个时就会提示端口已被占用。但服务器的监听端口,可以accept多次,建立多个socket;我的问题是服务器一个端口为什么能建立多个连接而客户端却不行呢?
2015年08月16日提问
评论
邀请回答
编辑
更多
默认排序时间排序
5个回答
答案对人有帮助,有参考价值8答案没帮助,是错误的答案,答非所问已采纳
TCP server 可以,TCP client 也可以。一个套接字只能建立一个连接,无论对于 server 还是 client。
注意报错消息是:
[Errno 106] (EISCONN) Transport endpoint is already connected
man 2 connect 说得很清楚了:
Generally, connection-based protocol sockets may successfully connect() only once; connectionless protocol sockets may use connect() multiple times to change their association.
就是说,TCP 套接字最多只能调用 connect 一次。那么,你的监听套接字调用 connect 了几次?
来点有意思的。
一个套接字不能连接两次,并不代表一个本地地址不能用两次,看!*加粗文字加粗文字*
>>> import socket >>> s = socket.socket() # since Linux 3.9, 见 man 7 socket >>> s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) >>> s2 = socket.socket() >>> s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) >>> s.bind(('127.0.0.1', 12345)) >>> s2.bind(('127.0.0.1', 12345)) # 都可以使用同一本地地址来连接哦 >>> s.connect(('127.0.0.1', 80)) >>> s2.connect(('127.0.0.1', 4321))
>>> netstat -npt | grep 12345 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 127.0.0.1:4321 127.0.0.1:12345 ESTABLISHED 18284/python3 tcp 0 0 127.0.0.1:12345 127.0.0.1:4321 ESTABLISHED 4568/python3 tcp 0 0 127.0.0.1:80 127.0.0.1:12345 ESTABLISHED - tcp 0 0 127.0.0.1:12345 127.0.0.1:80 ESTABLISHED 4568/python3
你们这些有女友的都弱爆了啦 :-(
更新:大家来玩 TCP: 一个人也可以建立 TCP 连接呢 - 依云's Blog
2015年08月19日回答 · 3月9日更新
9 评论
编辑
依云22.9k 声望
答案对人有帮助,有参考价值2答案没帮助,是错误的答案,答非所问
内核是以一个(著名的)5元信息组来标识不同的socket的:源地址、源端口、目的地址、目的端口、协议号。任何一个不同,都不叫“同一个socket”。
2015年08月20日回答
评论
编辑
sched_yield105 声望
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
首先,TCP链接是可靠的端对端的链接,每个TCP链接由4个要素组成:2组IP地址(本地和远端),2组端口地址(本地和远端)。其中如果需要跟端口信息绑定时,都需要调用bind函数,如果server端针对2个同样的IP、端口组进行同样的绑定时,第2次同样是不成功的。
2015年08月16日回答
评论
编辑
charliecui2.4k 声望
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
有个相关的问题: ftp的数据传输,服务器会用20端口主动连接客户端,如果两个客户端同时在一下载东西,那ftp 服务器能用20端口去连接两个ip ?(这时ftp的服务器其实是tcp里的客户端)
2015年08月16日回答
3 评论
编辑
hyanleo173 声望
1
能啊,看我的实验。
— 依云 · 2015年08月19日
展开评论
答案对人有帮助,有参考价值-1答案没帮助,是错误的答案,答非所问
不管是服务器还是客户端,建立TCP链接,同一个端口都只能使用一次。
这句话其实是**错的**!
对于TCP协议,要成功建立一个新的链接,需要保证新链接四个要素组合体的唯一性:客户端的IP、客户端的port、服务器端的IP、服务器端的port。也就是说,服务器端的同一个IP和port,可以和同一个客户端的多个不同端口成功建立多个TCP链接(与多个不同的客户端当然也可以),只要保证【Server IP + Server Port + Client IP + Client Port】这个组合唯一不重复即可。
> netstat -a -n -p tcp |grep 9999 tcp 0 0 127.0.0.1:51113 127.0.0.1:9999 ESTABLISHED 2701/nc tcp 0 0 127.0.0.1:51119 127.0.0.1:9999 ESTABLISHED 2752/nc
上述结果
127.0.0.1:9999中9999端口成功建立两个TCP链接,也就可以理解。
**客户端**发送TCP链接请求的端口,也就是后续建立TCP链接使用的端口,所以一旦TCP链接建立,端口就被占用,无法再建立第二个链接。
而**服务器端**有两类端口:侦听端口 和 后续建立TCP链接的端口。其中侦听端口只负责侦听客户端发送来的TCP链接请求,不用作建立TCP链接使用,一旦侦听到有客户端发送TCP链接请求,就分配一个端口(一般随机分配,且不会重复)用于建立TCP链接,而不是所说的
服务器一个端口能建立多个连接。
上述描述也比较片面,客户端如何请求及建立链接,服务器端如何侦听及是否分配新随机端口等...应该都可以在应用层面进行控制,所以上述描述可以作为建立TCP链接的一种方式,仅供参考。
一些英文的参考:
How do multiple clients connect simultaneously to one port, say 80, on a server?
TCP : two different sockets sharing a port?
2015年08月16日回答 · 2015年08月19日更新
9 评论
编辑
sam_wen12 声望
2
如果真是这样,为什么netstat 命令只看到监听端口而没有你说的另一个随机端口?
— hyanleo · 2015年08月16日
2
accept 才不会分配新端口号,不然大家不用考虑单机的 C10K 问题了,反正端口号不够用不是?
— 依云 · 2015年08月19日
相关文章推荐
- TCP server 为什么一个端口可以建立多个连接?(网络讨论)
- TCP server 为什么一个端口可以建立多个连接?http://segmentfault.com/q/1010000003101541
- Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结
- 详解Linux服务器最大tcp连接数 网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少?
- 一个TCP端口最多可以同时连接多少个客户端呢?
- server2003 域控制器为什么随便用一个已经建立的用户名都可以进入任何一台机器
- 一个端口可以有多少个TCP的连接?
- TCP连接建立过程中为什么需要“三次握手”
- 一个路由下两台可以ping通ip的机子sql2005不能建立连接
- 问题 如何断开VS2012中与SVNServer的连接?让项目在SVN上重新建立一个版本管理。
- TCP建立连接为什么需要三次握手而结束要四次
- TCP连接建立过程中为什么需要“三次握手”
- TCP/IP Server同一个端口 怎么区分不同socket
- SQLServer2005端口为什么从1433变成1434?(连接测试的时候使用1433不能够测试成功,但是使用1434就可以测试成功。)
- 一台独立的服务器是可以可以建立多个网站的,一个ip地址,一个端口
- 有关TCP方式连接建立时三次握手,为什么不是2次 或4次 5次
- TCP建立连接为什么是三次握手,为什么不是两次或四次?
- [找到问题了.Net丫丫]TCP Provider, error: 0 - A transport-level error has occurred when receiving results f 您的主机中的软件放弃了一个已建立的连接
- (1) linux 3.x - server - TCP连接建立系列 — 服务端接收SYN段
- TCP建立连接为什么需要三次握手的一些回答整理