网络初探01
前言:
最近在学习网络方面的知识,这篇文章是看完《网络是怎样连接的》这本书之后的学习总结。
总览
上图是一个Http网络请求的主要流程,我们目前主要关注的是客户端和服务端是怎样发送和接收请求的,至于中间的网络运营商怎样转发暂时不是我们的关注点。
我们从用户在浏览器输入地址开始,一直到服务器接收请求之后返回响应为止,一路探索网络是如何运作的。
客户端发送请求
浏览器根据域名请求DNS服务获取IP
· 假设用户要访问http://www.processon.com
,当用户在浏览器输入网址之后,浏览器是没办法直访问这个网址的,因为要访问服务器必须使用协议:IP:端口
这样的格式才行。
· 那么怎样才能让浏览器获得IP和端口呢?
首先,当用户没有输入端口的时候,浏览器会使用默认端口号80,所以只要服务器的端口是80,用户就不需要输入端口号,可以省略。剩下的IP需要通过DNS服务来查询,DNS是域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
· DNS提供的功能就是通过域名查询IP的功能,比方说DNS服务器中保存了这样一个key-value结构的数据:www.processon.com
→ 111.3.78.231
。那么浏览器就可以通过DNS查询到域名的IP是111.3.78.231
,然后拿到IP之后再去访问这个IP地址下端口为80的程序了。
· 实际上DNS的域名查询功能可以是域名与IP为一对多的关系,那么查询到多个IP应该使用哪一个呢,可以通过轮询,每次访问的时候,都用下一个IP就行了。
浏览器调用Socket库创建套接字
· 在浏览器拿到IP之后,需要访问这个服务器的时候,需要调用操作系统的Socket库来建立连接,Socket库可以看做是操作网络的一些组件的集合,所有的应用程序使用网络功能的时候都需要调用这个库。我们常用的connect、close等都是这个库的一些组件,关于这个库的其他知识点暂时还没学习到,就不展开说明了。
· 首先浏览器会去创建套接字,简单来说就是调用Socket库填写服务器IP和端口,再申请当前浏览器在这次连接使用的端口号。
浏览器发送数据
· 有了套接字之后,就可以发送数据了,当然在http请求中需要先向服务器建立TCP连接之后才能发送数据,发送数据和建立连接的通信过程是差不多的,只是TCP的头部设置不同,现在暂时关注发送数据的阶段。
· 浏览器将数据和套接字对象交给Socket库,Socket库将信息交给TCP模块,然后TCP模块会创建一个TCP头,将TCP头放到数据的前面,然后把整体交给IP模块,IP模块将TCP传递过来的所有内容都作为数据处理,然后在前面加上IP头和MAC头