如果你的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连接是打洞的其中一种方法。由于规则必须由一定量的数据分析而成,因此就必须向分析服务器发起大量连接,在同时打洞也要发起大量连提高命中机会。你只和一个进行打洞还好,但和数十数百进行打洞,你共享网络的资源就被你消耗上了。

最新文章

  1. Collections.shuffle
  2. 寻觅[Getting Answers]
  3. IIS监控指标
  4. 利用JavaScript函数对字符串进行加密
  5. Xcode报错:“Your build settings specify a provisioning profile with the UUID..... however, no such provisioning profile was found”
  6. 左偏树(DP)问题
  7. How to organize the Template Files in C++
  8. Bash判断文件是否存在
  9. KACK的处理方法
  10. wcf 配置总结
  11. Bootstrap入门(十二)组件6:导航标签页
  12. JavaScript OOP(三):prototype原型对象(即构造函数的prototype属性)
  13. UICollectionViewFlowLayout使用示例
  14. TensorFlow教程——Bi-LSTM+CRF进行序列标注(代码浅析)
  15. 通过runtime打印出对象所有属性的值
  16. 单点登录(一)-----理论-----单点登录SSO的介绍和CAS+选型
  17. UserAgent判断浏览器类型或爬虫类型
  18. mysql/mariadb学习记录——连接查询(JOIN)
  19. Hive三种不同的数据导出的方式
  20. Recursive sum in parent-child hierarchy T-SQL

热门文章

  1. python 2.x中的中文
  2. CVE 2019-0708漏洞复现防御修复
  3. 05jmeter-responses中有多组json数据,提取同一条json数据的两个字段
  4. Swagger -- 解决日期不正确
  5. 记录面试龙腾简合-java开发工程师经历
  6. stream流篇
  7. vue-route动态路由
  8. 你必须知道的容器监控 (3) Prometheus
  9. Android_Fragment栈操作 commit()问题分析
  10. js垃圾回收