浏览器输入url后发生了什么及TCP的一些细节
浏览器输入url后发生了什么及TCP的一些细节
1、解析URL
得到里面的参数,将域名和请求的资源分离,从而了解请求的是哪个服务器,请求服务器的什么资源等等。

2、浏览器封装HTTP请求报文
对URL进行解析后,浏览器确定了服务器和资源位置后,准备将这些信息封装成HTTP报文发送出去。
3、域名解析获得IP地址
先从本地浏览器缓存、操作系统缓存查找,再到hosts文件查找,再到顶级域名服务器查找,操作系统将找到的ip地址缓存起来,并返回给浏览器
4、三次握手建立TCP连接

三次握手简单地说就是确认客户端和服务端的发送、接收都正常。
- 客户端-------->服务端(此时服务端知道客户端发送正常,自己接收正常)
- 客户端<--------服务端(此时客户端知道自己接收正常,服务端发送正常,并不知道客户端是否接收正常)
- 客户端-------->服务端(此时服务端知道客户端接收正常,于是建立连接)
5、浏览器发送HTTP请求
建立连接后,浏览器与服务器之间就建立了一个虚拟通道,浏览器就可以发送HTTP请求了。
6、通过IP协议传输数据
浏览器发送请求(get\post),服务器返回html和css等静态资源
7、处理数据
浏览器接收到html,渲染,显示页面。
8、关闭连接
四次挥手

-
客户端--------->服务器(客户端发送断开请求)
-
客户端<---------服务器(服务器回应已收到断开请求)
<---------------------------(如果服务器不想断开连接,还有数据传输,则继续传输)
-
客户端<---------服务器(服务器也发出断开请求)
-
客户端--------->服务器(客户端收到断开请求后回复服务器,断开连接)
TCP连接
第四次挥手为啥要等待2MSL?Maximum Segment Lifetime最大报文段存活时间
假如第四次挥手失败了,因为丢失而未到达服务器会怎样呢?这样,服务器会一直收不到客户端的回应,也就无法得知客户端是否收到了即将要断开连接的请求。服务器不能判断客户端是否收到,本身就是一个BUG,于是才有的等待2MSL的情况。为了保证客户端最后一次挥手的报文能够到达服务器,若第4次挥手的报文段丢失了,服务器就会超时重传第3次挥手的报文段,所以客户端此时不是直接进入CLOSED,而是保持TIME_WAIT(等待2MSL就是TIME_WAIT)。当客户端再次受到服务器因为超时重传而发送的第3次挥手的请求时,客户端就会重新给服务器发送第4次挥手的报文(保证服务器能够受到客户端的回应报文)。最后,客户端、服务器才真正断开连接。
说白了,等待2MSL就是为了确保服务器能够受到客户端最后的回应。
client最大tcp连接数
tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip
server最大tcp连接数
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方
实际的tcp连接数
上面给出的是理论上的单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制,特别是sever端,其最大并发tcp连接数远不能达到理论上限。在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。
浙公网安备 33010602011771号