tcp的端口号

虽然写了一年多的网络编程, 但是总觉得有种浮沙筑高台的感觉,于是去买了本unix网络编程卷一去读. 果不其然看到第五章使用netstat去调试第一个程序时就产生了一个疑惑.

这个例子每accept一个连接就去fork一个进程去处理, 当我开了一个server和2个client时发现, server一共会有三个进程存在, 一个是listen, 另外两个是accpet出来的, 但是使用netstat去调试时却发现这三个进程其实共享server进程的bind的端口,以前只是知道”端口是用来标识同一个IP的不同进程之间数据收发”, 却从没有深究其中原理. 而之前在windows写socket程序一般都是多线程, 多进程的方案从来没用过, 所以从未觉得这句话有什么不妥.

可能这个问题太简单了,google了半天都没找到有人解答, 最终在tcp/ip详解卷一的第18章P194上找到这样一句话”tcp使用由本机地址和远端地址组成的4元组:目的IP地址, 目的端口号, 源IP地址和源端口号来处于是传入的多个链接请求”, 于是一下豁然开朗, 找到tcp的协议头翻了一下, 果然其实每个tcp segment都是有这个四元素的. 那其实就问题就很明显了, 根本不是进程与端口的问题, 其实应该是说”端口和IP地址(源端口, 目的端口, 源IP和目的IP)是用来标识不同socket之间的数据收发”.

再仔细回忆一下server端的完整步骤:
socket //获取一个socket descriptor
bind //将刚获取socket descriptor绑定相应的地址或port(一般地址为INADDR_ANY)
listen //向kernel标识接收向该socket上的连接请求
while accept //接收client的请求


大致猜测一下kernel的方式, 当收到tcp segment时首先去查看tcp segment中的目的端口并找到与目的端口相关的socket, 然后如果发现SYN此类与连接有关的segment的时候直接转发给被listen的那个socket, 否则就根据tcp segment的源端口号和源IP地址去匹配相应的socket进行数据收发.



评论

  1. 知道为啥抓包 抓到两个port了

发表评论