输入网址后,期间发生了什么

  1. 浏览器会先解析URL,解析出域名、资源路径、端口等信息,然后构造HTTP请求报文
  2. 域名解析,将域名解析成IP地址。会先查系统缓存是否有域名信息,如果有返回IP地址。如果没有再去查看本地系统hosts文件有没有域名信息,如果有就返回。如果没有再去本地DNS服务器查看。如果仍然没有就分别去根域名服务器->顶级域名服务器->权威域名服务器询问,最后返回IP
  3. 进行TCP三次握手建立连接,第一次握手会填上SYN标记位,同时填上源端口和目标端口
  4. 到网络层会加上IP头,填上目标IP地址和源IP地址
  5. 到数据链路层通过ARP协议获取到路由器的MAC地址,然后加上MAC头,填上目标MAC地址和源MAC地址
  6. 到物理层直接把数据包发送给路由器,路由器再通过下一条找到目标服务器,然后目标服务器收到SYN报文后,响应第二次握手
  7. 当双方都完成三次握手后,如果是http协议客户端就会将http请求发送给服务端;如果是https还需要ssl四次握手
  8. 目标服务器收到http请求后,就返回http响应消息,浏览器会对消息进行解析渲染,呈现给用户

DNS是如何解析的,是属于哪一层的协议

DNS是属于应用层的协议

alt text

会先查系统缓存是否有域名信息,如果有返回IP地址。如果没有再去查看本地系统hosts文件有没有域名信息,如果有就返回。如果没有再去本地DNS服务器查看。如果仍然没有就分别去根域名服务器->顶级域名服务器->权威域名服务器询问,最后返回IP保存到本地DNS服务器,然后本地DNS服务器将IP保存到本地缓存,并将查询结果返回给客户端

DNS解析用到了什么协议

UDP协议,因为UDP协议传输快,如果要保证可靠可以在应用层实现一个超时重传机制

输入域名如何知道端口

http的默认端口是80,https的默认端口是443,或者指定端口(比如:8080)

客户端向服务端的IP地址发送数据,服务端如何确定把消息传给哪个应用

每个传输层(如TCP和UDP)都使用不同的端口号来区分应用程序,服务端通过监听特殊的端口号来接受来自客户端的数据

现在很多网站都要求使用https,我们输入一个http网站,网站是如何实现由http调到https的

涉及服务器的配置,以下是nginx服务器端的配置方法来实现重定向

1
2
3
4
5
server{
listen 80
server_name example.com
return 301 https:
}
  1. 服务器网关收到http请求后,会返回给客户端一个响应,状态码为301(永久重定向)
  2. 浏览器收到重定向响应后,自动向服务器发送一个https请求