同时发起TCP连接
如果你的socket编程只限于创建SOCK_STREAM的socket,用connect-accept建立连接,然后就是recv,send。你就会惊奇tcp连接还可以不用accept。
上图为两个AF_INET-SOCK_STREAM的socket,各自绑定端口后,向对方同时发起TCP连接请求的,完成三次握手建立起连接后,一方向另一方发起了2个字节的内容。
要清楚,只要你的机器连接上互联网,不论你的机器是否监听某一端口,只要对方确定你的IP地址,数据包就会到达你的机器。端口是对应你的应用(程序),数据按端口送达你的应用(程序)。防火墙就是用来过滤数据包的。当你的机器在NAT后,数据包到达NAT后,被NAT检测到不满足与你的机器有端口映射关系,就被丢弃,不会转发到你的机器。
所以你不调用recv,你的机器仍然在接收数据,recv只是从socket的缓冲上消费数据。
另外socket的connect和accept是对使用者透明的,不理解的人就会有这样的印象,好像connect和accept成功之后,才会在绑定的端口上接收数据。connect和accept透明地进行着三次握手,也就是说connect和accept都要在绑定的端口上等待数据包。所以虽然NAT可以限制incoming连接(即监听连接)的端口映射,但当一个在NAT后机器发起外出连接(connect)时,NAT也必须为其映射端口。所以同时发起连接,双方都在端口上等待着握手回应,只要其中一方发过去握手回应,就能按协议约定完成三次握手,随后进行TCP通讯。如果两方(一方或两方)在NAT后,NAT都会为它们的外出连接进行端口映射,只要你掌握了NAT的映射规则,就可以进行打洞了,所以同时发起TCP连接是打洞的其中一种方法。由于规则必须由一定量的数据分析而成,因此就必须向分析服务器发起大量连接,在同时打洞也要发起大量连提高命中机会。你只和一个进行打洞还好,但和数十数百进行打洞,你共享网络的资源就被你消耗上了。
最新文章
- Collections.shuffle
- 寻觅[Getting Answers]
- IIS监控指标
- 利用JavaScript函数对字符串进行加密
- Xcode报错:“Your build settings specify a provisioning profile with the UUID..... however, no such provisioning profile was found”
- 左偏树(DP)问题
- How to organize the Template Files in C++
- Bash判断文件是否存在
- KACK的处理方法
- wcf 配置总结
- Bootstrap入门(十二)组件6:导航标签页
- JavaScript OOP(三):prototype原型对象(即构造函数的prototype属性)
- UICollectionViewFlowLayout使用示例
- TensorFlow教程——Bi-LSTM+CRF进行序列标注(代码浅析)
- 通过runtime打印出对象所有属性的值
- 单点登录(一)-----理论-----单点登录SSO的介绍和CAS+选型
- UserAgent判断浏览器类型或爬虫类型
- mysql/mariadb学习记录——连接查询(JOIN)
- Hive三种不同的数据导出的方式
- Recursive sum in parent-child hierarchy T-SQL