最近在复习计算机网络上的一些知识,产生了几点困惑。
- 首先是一道面试题,之前蚂蚁金服的面试官问到的:服务器突然崩溃了,然后重启服务器的时候80端口被占用了,什么原因,提示我与四次挥手有关。
- 之前看四次挥手的时候,有说到服务器上会有大量的time_wait浪费资源,就想到一个问题:服务器是上层是使用Http协议传输数据的。那么使用http协议传输数据的时候,谁先主动断开TCP连接呢?(只有主动断开的一方才会有timewait状态)
- 还有一个一直以来的疑惑这次终于搞明白了:服务器只监听了一个80端口,怎么处理这么多连接的,端口不会被占用吗?
带着这些问题查了一些资料,对这些问题也算是基本上搞明白了。
先说下socket。TCP/IP本身仅仅是一个协议,需要具体的实现。scoket就是对其实现之一。是支持TCP/IP协议的网络通信的一个基本操作单元。一个Socket连接是对一对TCP连接的抽象表示。socket由且只由一个五元组表示(客户端IP,客户端端口,服务器IP,服务器端口,使用的协议)。
首先第一个问题:其实现在我的观点还是四次挥手的时候服务器崩溃是不会导致端口被占用的。查到与四次挥手时端口占用相关的资料很少。但是在TCP/IP详解书上看到了一段描述,大致是说:当TCP连接处于TIME_WAIT状态时,通信双方将该连接(socket)定义为不可用的状态,也就是说只是不能建立一个完全相同的五元组socket。但是有一些系统在实现的时候加上了更严格的约束,一个端口号被一个处于TIME_WAIT的socket使用,那么这个端口号将不能再被使用,这也就意味着一个不能再使用这个