作者:何伟鹏链接:https://www.zhihu.com/question/34873227/answer/70038032来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
计算机网络庞大且复杂,很难一言或几言以蔽之。因此,这里我们只考虑最一般的场景,所谓“一般”,就是...比如,没有缓存,客户机和服务器不在一个局域网,输入的是一个域名而不是IP地址,etc。我们采用自顶向下的方法,也是时间顺序的方法,来解答这个问题。浏览器是C/S架构中的客户端,通过想服务器发送请求,获取文件(html,js,css等),再通过浏览器引擎的解释和渲染,将这些文件呈现成你现在看到的样子。1、TCP/IP参考模型首先,我们不得不了解一下TCP/IP参考模型。如下图所示,TCP/IP参考模型分为四层:应用层、运输层、网络层和接口层。浏览器所完成的工作就属于应用层的范畴。
应用层: 为用户提供各种服务,比如我们浏览网页时用到的HTTP,收发邮件时用的SMTP,登录远程主机用的SSH。
传输层:提供端到端的传输服务。更具体地讲,提供进程到进程的传输服务。
网络层:和传输层一样,可以概括为提供端到端的传输服务。更具体地讲,网络层提供主机到主机的传输服务。
网络接口层(链路层):为直接连接的设备提供传输服务,将数据帧转换为比特流,并将比特流转换为物理电路的电压高低信号。
2、往哪里发送请求?假设我么输入的地址是zhihu.com
浏览器看到这个域名的时候,就好像我们想去一家从没去过的餐厅吃饭,只知道名字是“黄大仙肠粉”但不知道具体地点在哪里。这个时候,我们打开地图,搜索“黄大仙肠粉”后找到一个地址:衡山路110号,于是我们便知道该去哪了。域名就像是一个餐厅的名字,而IP地址相当于一个具体的地址。浏览器必须知道所请求服务器的IP地址,发出的请求才有目的地。DNS(Domain Name System)提供的服务就是将知乎的域名转换成其服务器IP地址。DNS具有两层含义:①一个由分层的DNS服务器实现的分布式数据库;②一个允许主机查询分布式数据库的应用层协议。有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器以下图的层次结构组织起来。除此之外,还有一类重要的DNS,称为本地DNS服务器。严格来说本地DNS服务器并不属于DNS服务器的层次结构,但它在整个查询的过程中却扮演着重要的角色。
TCP是面向连接的,在实际发送数据之前,客户端和服务器需要建立起一个TCP连接。这种TCP“连接”只是逻辑上的链接,因为其状态完全保留在两个端系统中,中间路由器对TCP连接毫不知情。
目的端口和源端口号是为了在多路复用和多路分解时选择套接字时使用的。数据序号和确认序号是为了传输数据的完整性和顺序而设置的。用户数据这一个字段就存储了应用层生成的HTTP报文。ACK、SYN和FIN是在建立连接和关闭连接时使用。其他用于流量控制、拥塞管理等用途的字符就不展开了。5、路由寻址现在两个端系统已经建立起了连接,请求也被传送到客户端主机的网络层。网络层是协议栈中最复杂的层次,应用层和传输层只运行在两个端系统,而网络层不仅运行在端系统,还运行在各个中间节点上。我们先来看看IP数据报的格式。网络层实现的最重要的功能是路由选择,简单地说,就是怎么把这一个IP数据报从客户端主机出发,通过网络中的若干个路由器,到达目的主机。从概念上讲,IP路由选择是简单的,特别对于主机来说,如果目的主机和源主机直接相连(如点对点链路),或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发送到一默认的路由器上,由路由器来转发该数据报。大多数的主机都采用这种简单机制。
搜索路由表,寻找能与目标网络号相匹配的表目。如果找到,则把报文发送给下一跳节点。
搜索路由表,寻找“默认”的表目。如果找到,则把报文发送给下一跳节点。
如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。在我们的例子中,H1通过搜索自己的路由表将数据报转发给R1,R1根据路由表转发给R2,最后到达H2。6、关闭连接目标主机收到了请求后,自底向上地对该请求进行处理。链路层把数据报传给网络层,网路层将TCP数据段通过对应的Socket传给应用程序。应用程序处理请求后产生一个应答的HTTP报文,又经过了一层层的封装、一跳跳的传输到达了源主机。这样就结束了吗?那一条TCP连接还没有关闭呢,源主机和目标主机上都为它分配了资源呢,如果不释放掉的话资源很快就会耗尽(DDoS攻击就是利用这一点)。于是,当传输层收到了应答之后,就要关闭这条连接了。但是,又不能悄悄地自己关了,目标主机那边还不知道你要不要关闭呢。于是乎,就有了对应创建TCP连接“三次握手”的关闭TCP连接“四次挥手”。如下图所示,客户端向服务器发出了FIN报文段,服务器收到后,回复一个ACK应答。然后,服务器也向客户端发送一个FIN报文段,随后关闭了服务器端的连接,释放了资源。当客户端收到之后,又向服务器回复一个ACK应答。过了一段计时等待,客户端也关闭了连接,释放资源。这一段计时等待的时间是为了客户端重传最后的ACK防止其丢失。
剩下的事情,就交给浏览器了。