写的很简单,后续会不断补充完善
我们打开一个浏览器,在地址栏输入正确的URL,例如http://www.baidu.com
按下回车,浏览器开始解析这个URL, 并使用socket库提供的gethostbyname查询域名对应的ip,
而调用gethostbyname用到了协议栈向DNS服务器进行通信,返回查询到的ip
有了ip,并根据解析的URL,浏览器可以生成http请求报文了,
已经根据http协议生成了http请求报文,现在需要做的就是将报文发送给服务器,
调用socket的库函数,根据ip和http服务器默认端口80,通过套接字使用connect对http服务器发起tcp连接,
三次握手后,连接建立成功,浏览器程序调用系统接口write或send向服务器发送http请求,
数据从用户态(应用程序)copy到内核态(操作系统)的缓冲区内,
协议栈(实现tcp/ip等传输层、网络层、数据链路层协议的程序)对报文进行封装,
最后通过网卡驱动,驱动网卡(物理硬件)将报文从数字信号转换成物理信号,并通过以太网发送出去,
经过交换机,路由器,最后到达http服务器所在的局域网,
经过防火墙(一定),缓存服务器(很可能),负载均衡器(可能),
到达http服务器后,通过网卡对数据转换,协议栈的解析,最后交给服务器程序,
接下来http服务器解析请求,根据http协议生成返回消息,将返回的消息原路返回发送给客户端