查询本地计算机有没有存储域名 baidu.com 对应的服务器 IP, 如果存储了, 浏览器直接向目标服务器发起三次握手的连接请求; 如果没有存储, 则向 DNS 服务器发起 "查询 baidu.com 对应服务器 IP" 的请求, DNS 服务器返回 baidu.com 对应的目标 IP 后, 向目标 IP 发起三次握手的连接请求, 如果连接成功, 则在本地备份目标 IP
将请求发送到目标 IP 的具体细节 (为什么 MAC 地址与 IP 地址缺一不可) : 在 OSI 七层协议中 MAC 地址属于第二层数据链路层, IP 地址属于第三层网络层, 浏览器发出的请求时, 会发起 ARP 广播, 查询本地网络中, 是否存在目标 IP 主机, 如果存在, 直接将浏览器请求的 MAC 地址定为目标 IP 主机的 MAC 地址, 如果不存在, 则将浏览器请求的 MAC 地址定为本地网络环境中路由器 A 的 MAC 地址, 路由器 A 会将浏览器请求转发到另一个网络的路由器 B(请求的 mac 地址被修改, 修改为路由器 B 的 mac 地址), 路由器 B 子网内如果存在目标主机 IP, 则直接将浏览器请求的 ip 地址修改为目标主机的 MAC 地址, 如果不存在, 则转发给浏览器 C, 通过不断地修改请求 MAC 地址完成了浏览器请求在互联网内的层层接力, 最终到达目标 IP 主机
请求与响应
服务器接收到请求后, 如果设置反向代理服务软件 (如 Nginx), Nginx 会将请求转发到服务对应的端口 (以 Django 服务为例, 如果 Django 运行在 3309 端口, Nginx 会将请求从 80 端口转发到 3309 端口)
Django 接收到请求后, 中间件会对请求进行预处理, 然后请求会根据正则, 匹配主目录下的 urls.py, 匹配成功后, 会将请求分发给独立的 App, 在 App 内也含有 urls.py, 通过正则匹配, 请求会被对应到 App 内相应的视图函数
服务器处理请求
视图函数会处理请求, 产生响应, 响应通过中间件的处理后, 离开 Django, 返回给 Nginx, Nginx 会将响应返回给浏览器 (这里简化返回路线)
关于三次握手和四次挥手:
三次握手:
浏览器发起连接请求 (浏览器: 我们明天早上 8 点见面, 收到请回复)
服务器接收到请求后, 返回响应 (服务端: 确认收到, 我们明天早上八点见面)
浏览器发出接收到服务器响应的确认信息 (浏览器: 我收到了你的确认信息!)
四次挥手:
浏览器发出断开连接的请求 (浏览器: 我该问的都问完了, 没有其它的问题了)
服务端返回响应 (服务端确认了浏览器不会再发送请求的信息)(服务器: 我收到了你问完了的信息了, 待我把你前面的问题回答完, 我们就断开连接)
服务端发出断开连接的请求 (服务器: 我把你的问题都回答完了, 你确认没有其他要问的了么?)
浏览器返回响应 (浏览器确认了服务端已经将资源发送完毕的信息)(浏览器: 我没有其它要问的, 断开连接吧!)
三次握手与四次挥手. png
来源: http://www.jianshu.com/p/b78b64d7f0ee