(1)域名解析地址
从网络编程(1)看到,我们访问www.baidu.com只是一个域名,需要一个“域名系统”帮我们找到真实的IP地址。一般的,会从我们的浏览器DNS缓存中,查看我们之前是否有访问过这个网站,如果有就找到对应的IP条目进行访问;如果没有则默认会从自己的主机host文件(位于C:\Windows\System32\drivers\etc)中查找,如果有就直接访问;如果没有这时就需要请求我们本地配置的DNS服务器(这个一般是我们的网络供应商提供的),发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求),运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。如果没有找到对应的条目,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求。首先先从根域的DNS的IP地址(A),问A“www.baidu.com的IP地址是多少?”A一看发现不知道这个的IP地址是多少,不过他知道B管“com”这类顶级域的IP地址,于是告诉让我去找B。找到B后问他“www.baidu.com的IP地址是什么?”然而B只知道“baidu.com”这类权限域名归C管,让我去找C。于是又跑到C那里问“www.baidu.com的IP地址是什么?”,最后C在自己的服务器上一查发现有对应的IP条目,就返回告诉了我们。并返回给Windows系统内核,内核又把结果返回给浏览器,终于浏览器拿到了并缓存起来。
(2)发起TCP的3次握手
那么我们进过(1)步骤解析出IP地址之后,我们需要在两个主机之间建立连接,分为3次握手。
经过(1)-(4)之后 浏览器解析html代码,并请求html代码中的资源(图片等)并对页面进行渲染呈现给用户。我们从请求报头里面看到Connection:keep-alive。一般来说一个连接请求完毕后会释放TCP连接。由于与服务器频繁的交互,所以keep-alive能够保持与服务器的“连接”,无需每次都断开,减少开销。
客户端将请求封装成http数据包-->封装成Tcp数据包-->封装成Ip数据包--->封装成数据帧--->硬件将帧数据转换成bit流(二进制数据)-->最后通过物理硬件(网卡芯片)发送到指定地点;服务器硬件首先收到bit流,然后转换成ip数据包。于是通过ip协议解析Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。
原文地址:http://blog.csdn.net/u010794180/article/details/43966179