写在前面
本篇博客旨在理解在浏览器中输入url
地址后,浏览器和服务器之间都干了些什么。
整个流程如下:
- 域名解析,获取IP地址
- 建立TCP连接,浏览器发送html请求
- 服务器web相应,发回html响应
- 释放TCP连接,浏览器解析html,渲染呈现页面
域名解析,获取IP地址
输入网址后,浏览器会根据域名获取IP地址
。怎么获取IP地址呢?
浏览器要首先获取DNS
。那什么是DNS
呢?
DNS(Domain Name System)即网络名称系统,它是一个将域名和IP地址相互映射的分布式数据库。简单地说,DNS
就是一种域名和IP地址查对表,通过搜寻DNS法则,获得当前域名对应的IP地址
,反之亦然。
浏览器查询DNS
缓存的方式采用递进式查找,即
浏览器缓存–>系统缓存–>路由器缓存–>ISP DNS缓存
建立TCP连接,浏览器发送html请求
浏览器通过DNS
查找到url
对应的ip地址
之后,通过握手协议与服务器建立TCP连接,随后向服务器发送http请求。
建立TCP连接
socket
socket
是对TCP/IP协议的封装,本身不是一个协议,而是一个调用接口(API),是对TCP/IP协议的抽象,提供了方便的基本函数接口。
socket建立连接
建立socket连接至少需要一对*套接字,其中一个运行在客户端,称为ClientSocket
。另一个运行在服务器端,称为ServerSocket
。
套接字连接过程如下:
1. 服务器监听:服务器端处于实时监控状态,等待客户端连接请求。
2. 客户端请求:客户端套接字提出连接请求,提供要连接的服务器套接字的地址和端口号。
3. 连接确认:当服务器监听到客户端请求后,就建立一个新的线程,把服务器端套接字的描述发送给客户端,等待客户端确认。建立连接后,服务器继续保持监听状态,等待接受其他客户端套接字请求。
请求报文
一个http
请求报文由请求行< request-line >、请求头部< headers >、空行< blank-line >、请求数据< request-body >4个部分组成。下图是请求报文的一般格式。
请求行
请求行由请求方法字段、URL字段、HTTP协议版本三个字段组成,用空格分开。例如
GET /index.html HTTP/1.1
#常见的请求方法除了GET还有POST,两者区别是前者将数据存放在url中并以?间隔,后者将数据封装在HTTP请求数据中,以名称/值的形式出现。
请求头部
请求头部通知服务器有关客户端请求的信息,由关键字/值对组成,每行一对,关键字和值之间用:
分隔。
空行
最后一个请求头部之后需要一个空行,发送回车符和换行符,通知服务器以下不再有请求头部。
请求数据
请求数据不用于GET
方法 ,而用于POST
方法中。
服务器web相应,发回html响应
响应报文
一个http响应报文由状态行< status-line >、响应头部< headers >、空行< blank-line >和响应数据< response-body >4个部分组成,响应报文的一般格式如下图:
状态行
状态行由HTTP协议版本、服务器返回的响应状态码以及对应的文本描述组成。
状态码由三位数字组成,第一位定义了响应的类别。
1xx:信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。
2xx:成功状态码,表示服务器已成功接收到请求并进行处理。
3xx:重定向状态码,表示服务器要求客户端重定向。
4xx:客户端错误状态码,表示客户端的请求有非法内容。
5xx:服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。
响应头部
语法规则与请求头部相同,略。
空行
略
响应数据
服务器返回给客户端的文本信息。
释放TCP连接,浏览器解析html,渲染呈现页面
略。