在你输入网址按下确认后,到底发生了什么

140 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2天,点击查看活动详情

觉得对你有益的小伙伴记得点个赞+关注

后续完整内容持续更新中

希望一起交流的欢迎发邮件至javalyhn@163.com

1. 构建演示图

image.png

2. 流程演示

假设Web服务器的域名为www.JavaLyHn.com ,DNS服务器中已经记录了该域名所对应的IP地址。

我在用户服务器中输入Web服务器的域名

image.png

接着用户PC中的DNS客户端进程会发送一个DNS查询请求报文,其内容为域名www.JavaLyHn对应的IP地址是什么,DNS查询请求报文需要使用运输层的UDP协议,将请求封装成UDP用户数据报。在短暂端口号49151~65535中挑选出一个未被占用的用来表示DNS客户端进程,比如 49152 ,目的端口号设置为DBS服务器端的进程所使用的熟知端口号53。

image.png

接着将UDP用户数据报封装到IP数据报中,通过以太网,将数据报发送给DNS服务器。

DNS服务器端收到该数据报后,从中解封出UDP用户数据报,UDP首部中的目的端口号为53,这表示应该将该UDP用户数据报的数据载荷部分,也就是DNS查询请求报文的内容,然后按其要求查找对应的IP地址。

接着向用户PC发送相应的DNS响应报文,其内容为域名www.JavaLyHn对应的IP地址是192.168.0.3,DNS响应报文需要使用运输层的UDP协议将响应报文封装成UDP用户数据报,其中UDP首部源端口号为53,目的端口号为49152,这表明应该将该 DNS用户数据报的内容交付给用户PC中的DNS客户端进程。

image.png

用户PC收到该数据报后,从中解封出UDP数据报,DNS客户端进程解析DNS响应报文中的内容,就可以知道自己之前所请求的Web服务器域名为192.168.0.3

现在,用户PC中的Http客户端进程就可以向Web服务器发送Http请求报文了。其内容为首页内容是什么。Http请求报文需要使用运输层TCP协议封装成TCP报文段,其首部中源端口号为49152(这里我选择和之前保持不变),目的端口号为Http服务器端的进程所使用的熟知端口号80。

image.png

接着将TCP报文段封装到IP数据报中,通过以太网,将数据报发送给Web服务器。

Web服务器收到该数据包后,从中解析出该TCO报文段的数据载荷部分,TCP首部中的目的端口号为80,这表明应该将该TCP报文段中的数据载荷部分,也就是Http请求报文,交给本服务中的Http服务器端进程,Http服务器端进程解析Http请求报文的内容,然后按要求查询首页内容。

接着向用户PC发送Http响应报文,其内容为 我的首页内容是....,Http响应报文需要使用运输层的TCP协议封装为TCP报文段,其中源端口号为89,目的端口号为49152(这是PC之前发送Http请求报文的Http客户端进程所使用的短暂端口号),接着封装为到IP数据报通过以太网发送到用户PC。

用户PC解析接收到的Http响应报文段,TCP报文段中的首部中的目的端口号为49152,这表明应该将TCP报文段的数据载荷部分,也就是Http响应报文,交付给用户PC中的Http客户端进程,Http客户端进程解析Http响应报文的内容,并在浏览器上进行显示。

(下面是假设所展示的内容) image.png