【Socket编程】Tcp连接中accept生成新socket与监听socket的区别

来源:互联网 发布:软件怎么申请专利 编辑:程序博客网 时间:2024/05/23 17:58

参考自:socket的accept函数解析以及服务器和多个客户端的端口问题(L未若的博客)

新建立的连接使用的端口号是否和listen所用端口号相同呢?


如果认为是会分配新的端口,就大错特错了。因为:

1、现在使用多路IO复用epoll等,配置好点的服务器可以支持数十万个并发连接,而端口号只有16位,最多才65535,且加上一些常用的端口号不能使用,可用的端口号都没那么多。

2、现在服务器大多使用防火墙,防火墙只对特定端口开放。如果accept随机分配端口号,会不能通过防火墙。

TCP/IP协议中,IP协议是端到端的协议,它只是负责把把数据发送到端,交付给上层而已。传输层TCP、UDP加上了端口号,目的是区分不同的应用。


那么对于web服务器,它在一个端口建立多个连接,应用程序怎么区收到的信息来自哪个客户端呢?
现在才理解到accept返回的新socket包括四部分:源IP、源端口号、目的IP、目的端口号。这样在一个应用程序中,就算和多个客户端建立连接,在收到数据后,应用程序通过目的IP和目的端口号也能区分是哪一条连接。


用以前python写的web服务器实验一下:

服务器监听8888端口,在未建立连接时,可以看到在监听8888


在通过一个客户端建立连接后,可以看到建立了一条连接,端口号也是8888,监听的还是8888。


再次建立一条连接,发现其端口号还是8888,监听的也还是8888。




另附一道鹅厂面试题:tcp三次握手与accpet()间的关系?

tcp三次握手发生在connect step.

accept只是把内核中的“已完成连接队列(FIFO with established state)”取出, 
另一个队列是“未完成连接队列( FIFO with syn_rcvd state)”,并且这两个队列总和的最大值是backlog.

原创粉丝点击