假如在浏览器中访问百度,即输入URL为“www.baidu.com”,会发生什么?
1.比较笼统的来说:
1.浏览器解析我们输入的URL信息,得到各部分信息,默认的请求方法是GET方法
2.根据得到的信息与百度服务器进行TCP连接
3.浏览器进行 Request 的拼接过程
String request = "GET / HTTP/1.1\r\n
Host: www.baidu.com\r\n
Content-Length: 0\r\n
\r\n"
4.浏览器通过TCP协议中的连接,把Request发送给百度的服务器
5.浏览器等待百度的服务器发回响应
6.根据响应内容,把结果展示在浏览器界面上
2.细致的说:
主要描述上面的六个步骤的细节。
1.浏览器解析我们输入的URL信息,得到各部分信息
应用层:
首先,浏览器通过解析,得到目标ip和目标端口,假设ip和端口分别是 61.35.148.93 和 80 ,此时浏览器调用
new Socket(61.35.148.93, 80);
2.TCP连接
TCP开始三次握手:客户端给服务器发送TCP段,再封装成 IP 包,通过目标 ip + 路由表,确定下一跳 ip,再根据 ARP 表 + 下一跳 ip,确定目标 MAC 地址,封装成以太帧,在广播域中广播以太帧,路由器对以太帧进行解包/分用,再经封装,广播,到达下一个路由器,直到到达目标地址。
此时,Socket返回。
3.浏览器准备HTTP请求,进行 Request 的拼接过程
准备好后,浏览器调用
out = socket.getOutputStream();
out.write(request);
通过刚才建立的 TCP 连接,按照字节流形式发送 HTTP 请求
4.浏览器通过TCP协议中的连接,把Request发送给百度的服务器
5.浏览器等待百度的服务器发回响应
浏览器调用
in = socket.getInputStream();
根据 HTTP 协议读取响应
String responseLine = …;
Map<String, String> headers = …;
String body = …;
根据 Content-Type,知道内容是 html 格式。
根据 HTML 标准,解析 html 内容并显示
6.根据响应内容,把结果展示在浏览器界面上