关于TCP协议四元组确定唯一性的问题。

wjb_yd 2014-02-20 03:16:38
今天做了一个实验,机器A(假设IP为1.2.3.4)在port1上监听连接请求,机器B(假设IP为4.3.2.1)对机器A请求连接,假设内核选择的端口号为port2。这时就建立了一个tpc四元组:1.2.3.4:port1<->4.3.2.1:port2。
由于四元组的唯一性,那么1.2.3.4:port1<->4.3.2.1:port2和4.3.2.1:port2<->1.2.3.4:port1其实是没有区别的,但是4.3.2.1:port2<->1.2.3.4:port3应该就是另外一个四元组了。所以我就想在机器B上对port2进行监听,可是返回了10049,告诉我地址无法重用了,操作系统为什么要阻止我这么做,仅仅的为了防止机器A再用port1去连接机器B的port2,导致重复连接吗?
可不可以这样总结:如果存在一个四元组ip1:port1<->ip2:port2的话,那么机器A和机器B都无法在port1和port2上再进行监听了?
...全文
1464 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Johnblx 2014-02-27
  • 打赏
  • 举报
回复
引用 楼主 wjb_yd 的回复:
今天做了一个实验,机器A(假设IP为1.2.3.4)在port1上监听连接请求,机器B(假设IP为4.3.2.1)对机器A请求连接,假设内核选择的端口号为port2。这时就建立了一个tpc四元组:1.2.3.4:port1<->4.3.2.1:port2。 由于四元组的唯一性,那么1.2.3.4:port1<->4.3.2.1:port2和4.3.2.1:port2<->1.2.3.4:port1其实是没有区别的,但是4.3.2.1:port2<->1.2.3.4:port3应该就是另外一个四元组了。所以我就想在机器B上对port2进行监听,可是返回了10049,告诉我地址无法重用了,操作系统为什么要阻止我这么做,仅仅的为了防止机器A再用port1去连接机器B的port2,导致重复连接吗? 可不可以这样总结:如果存在一个四元组ip1:port1<->ip2:port2的话,那么机器A和机器B都无法在port1和port2上再进行监听了?
应用层在选好个端口号交给TCP使用的时候,TCP层肯定要检查这个端口已经被使用了没有, 你已经使用了一个端口让TCP做链接使用, 你还想让TCP是用这个端口做接收链接使用。 这个端口应该很累。 有谁看过底层代码的话,给讲一下啊 学习了
wjb_yd 2014-02-25
  • 打赏
  • 举报
回复
额,100分都木有人要么
wjb_yd 2014-02-20
  • 打赏
  • 举报
回复
引用 5 楼 xiaoc1026 的回复:
TCP 协议有SEQ 标识数据包,在应用层自然可以区分哪个数据包归属哪个SOCKET,它本就是一个封装的东西。
seq是表示tcp数据包的先后顺序的,跟您说的区分socket貌似没啥关系吧
见习学术士 2014-02-20
  • 打赏
  • 举报
回复
TCP 协议有SEQ 标识数据包,在应用层自然可以区分哪个数据包归属哪个SOCKET,它本就是一个封装的东西。
wjb_yd 2014-02-20
  • 打赏
  • 举报
回复
回问两位版主大大两个问题: 1.首先ip1:port->ip2:port2和ip2:port2->ip1:port1会被内核判定为两个相同的tcp四元组吧。 2.如果真的通过设置套接字选择,建立了两个这样的套接字,那ip协议处理一个port1或者port2包的时候,到底将数据传递给哪个套接字呢?
许文君 2014-02-20
  • 打赏
  • 举报
回复
想要监听同一个端口那么需要设置端口重用。
zdleek 2014-02-20
  • 打赏
  • 举报
回复
理论上是不可重复监听同一IP的同一端口, 楼主可以简单写个代码验证一下
oyljerry 2014-02-20
  • 打赏
  • 举报
回复
要么设置端口重用,一般情况都是新起一个侦听

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧