如何让阅读后进入脑中的知识点更加有体系,如何让抽象的知识变的更加活灵活现,阅读后的梳理可以让我们更好地做到这一点。同时实践能够让我们更加清楚地了解新知识的应用场景。这篇便是我学习网络的初章。
了解在地址输入栏中简单的按下一个回车背后复杂的故事
在了解本文主题之前我们不妨花上小几分钟简单阅读一下一下的内容,或许会有新的收获
1.浏览器的各种访问目标统称为URI
2.尽管浏览器能够解析网址并生成HTTP消息,但它本身并不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来实现
3.仅凭32位 的IP我们无法区分哪部分是网络号,哪部分是主机号。ip=网络号(xx小区)+主机号(xx室)
4 ! 主机号部分bit 全为0,表示一个子网 如192.168.1.0 , 192.168.0.0
? ! 主机号部分bit 全为1,表示一个子网内广播地址 如192.168.1.255 , 192.168.0.255
5.子网掩码为1的部分表示网络号,子网掩码为0的部分表示主机号。
6.子网掩码表示网络号与主机号之间的边界
7.在域名中,越靠右的位置表示其层级越高,比如www.lab.glasscom.com这个域名如果按照公司里的组织结构来说,大概就是“com事业集团glasscom部lab科的www”这样。
8.服务器一方先创建套接字,然后等待客户端向该套接字连接管道
9.如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制
10.客户端在创建套接字时,协议栈会为这个套接字随便分配一个端口号。接下来,当协议栈执行连接操作时,会将这个随便分配的端口号通知给服务器。
正题开始
? 首先我们都知道url 并不是网络通信中真正有效的信息,在网络中我们通过ip 来确认目的地服务器,当我们获取到ip 后,会将ip 等用于网络数据传输的信息一并交给操作系统的协议栈。
? 这里有一点基础的概念:我们建立在操作系统之上的应用程序并不能之间进行与硬件的沟通,一切应用对于硬件的操作都要通过操作系统调用,不能想当然的认为是应用操作了硬件,显然网络的通信是需要硬件支撑的。
? ok,那么我们怎么才能知道目的地的ip 呢,答案就是解析你输入的url ,就好比电话号码我们不可能记住身边每一个人的电话号码,因为它是并不存在具体的含义。而我们常用的电话簿就用简单易记的名字或者绰号对应了电话号码,比如我们可以轻松的点击"二狗"的头像并联系他。
ip -> 电话号码 , url -> 你对好友的备注, ? -> 电话簿
问:? 处应填入什么? 答案:DNS服务器
当然,这样形容并不是完全正确,因为在一方面电话簿是一个本地的记录,而DNS不存在于本地。但是就理解来说已经非常易懂了。
好的那么我们开始讲讲浏览器是如何通过远程访问将ip 这一信息拿到手的吧。这里我们值得一说的是我们会忽略一些细节,比如去浏览器解析缓存中存在的url ->ip 映射,dns 建立udp 通信等并不主要的内容
图解ip获取的过程
我们主要将目光放在去向DNS服务器的这条路线上。
- 首先应用程序会使用系统提供的Socket库创建套接字。在这里我们可以这样思考:为什么我们发出请求到服务器服务器就能给我们响应呢,是因为服务早早就让自己那端创建了一个套接字,当然套接字只是一个抽象的概念,只并不存在实体。然后服务端那边的套接字就一直等着另一个套接字与之连接。就像是管道一样能够传输其中的数据流。
2.那客户端应该如何去识别他要接入的套接字呢。这些都需要使用到库中的解析器 。他会根据输入的url 提取出有用的信息比如: 端口号 。平时我们的浏览器进行网页访问的时候都是直接输入一串url ,而不用去设置端口号这是因为浏览器访问http请求默认使用80端口。
3.那服务器的套接字我们能够分辨出来了,而客户端可能会有多个应用同时对不同的服务端发出请求,怎么样才能让不同的应用找到自己创建的套接字呢?换句话说就是规避数据传输混乱的问题呢,这里就要使用到创建套接字时生成的描述符了。我们只需要知道这相当于是一个套接字的标识即可。
如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制
此篇仅为阅读《网络是怎样连接的》一书第一章知识的简单梳理。
|