参考https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc
学习如下:
首先在浏览器地址栏输入url,浏览器开始解析url,确定使用的协议是http还是https
在本地缓存开始查找对应的ip
本地host查找ip
本地路由器dns查找ip
此上都查不到,需要到dns服务器查找ip
在dns服务器上,检查缓存中是否存在ip
如果不存在,或者缓存过期,需要在根域名服务器上查找对应ip
根域名服务器同样检查缓存,无则检查域名由哪一个dns服务商负责解析,然后请求转发,获取对应的ip
获取到ip之后,ip返回到本地服务商的dns,本地dns更新缓存。客户端拿到了ip
ip到达客户端后,通信过程需要首先取得联系,获得对方回应,使用三次握手
三次握手
过程:客户端发送联系请求、服务器回应、客户端收到确认。在过程中,同步连接双方的序列号和确认号并交换 TCP) 建立tcp连接,与服务器建立短连接。
三次握手就是tcp连接的建立,本连接一定是一方主动,一方被动
它可以防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
消息传递需要使用到ip协议(确定出发ip和目的地)、arp(如何从一个路由器到下一个路由器,确定下一个节点的地址,使用的是mac地址)、ospf协议(找出最佳路径)等
这个建立的连接是可靠。浏览器就可以使用http协议请求网页内容,将http消息打包,通过tcp协议发送给服务端
服务端收到请求报文后,处理报文信息,处理完成后将数据打包返回给客户端
客户端收到http应答后,提取html文件,进行渲染,显示出网页。
通信完成
通过四次挥手,拆除tcp连接。两方均可发起,通信结束。
四次挥手:
1.客户端想释放,向服务器发送一段tcp报文,客户端进入半关闭状态,关闭发送通道,接受通道仍然开启。
2.服务器接受之后,确定了客户想法,于是进入半关闭状态,返回报文,开始准备释放到客户端的连接
客户端接收到后,确定了服务器已经收到了自己的释放需求,客户端进入fin-wait-2阶段
3.服务器发出确认报文后,经过半关闭状态,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文,然后进入last-ack阶段,停止发送,但仍然可以接受
4.客户端收到第二次报文后,确认了服务器端已做好释放连接的准备,进入TIME-WAIT阶段,并向服务器端发送一段报文,等待2msl
服务器端收到客户端报文之后,进入CLOSED阶段。正式确认关闭服务器端到客户端方向上的连接。
客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。
为什么“握手”是三次,“挥手”却要四次?
TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。
即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。
TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?
建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。