本文是leetcode上《网络是怎样连接的》阅读笔记
网络是怎样连接的
第一章节
-
前面介绍的这个负责搬运数字信息的机制,再加上浏览器和 Web 服务器这些网络应用程序,这两部分就组成了网络。也就是说,这两部分组合起来,就是网络的全貌
-
名词:协议栈、网卡、集线器、缓存服务器、负载均衡器
-
先查出 Web 服务器的 IP 地址
-
查询到 IP 地址之后,浏览器就可以将消息委托给操作系统发送给 Web 服务器了
-
www 只是 Web 服务器上的一种命名、是 Web 的提出者最早开发的浏览器兼 HTML 编辑器的名字
以 www 开头的,但这并不是一定之规,只是因为最早设计 Web 的时候,很多 Web 服务器都采用了 www 这样的命名,后来就形成了一个惯例而已
在域名中,越靠右的位置表示其层级越高,比如 www.lab.glasscom.com 这个域名如果按照公司里的组织结构来说,大概就是“com 事业集团 glasscom 部 lab 科的 www”这样。其中,相当于一个层级的部分称为域。因此,com 域的下一层是 glasscom 域,再下一层是 lab 域,再下面才是 www 这个名字。
-
例如在访问 Web 服务器和 FTP 服务器时,URL 中会包含服务器的域名 [⑤] 和要访问的文件的路径名等
-
URL:Uniform Resource Locator
FTP:File Transfer Protoco
端口号:这里请大家理解为一个用来识别要连接的服务器程序的编号 -
目录(directory)这个词的意思相当于 Windows 中的文件夹(folder)
-
http://www.lab.glasscom.com/dir/ : 我们会在服务器上事先设置好文件名省略时要访问的默认文件名
http://www.lab.glasscom.com :当没有路径名时,就代表访问根目录下事先设置的默认文件 [②],也就是 /index.html 或者 /default.htm 这些文件,这样就不会发生混乱了。 -
Uniform Resource Identifier,URI
所以URL是URI的子集。URL是以描述人的位置来唯一确定一个人的。
而URL就是用定位的方式实现的URI。 -
表单:网页中的文本框、复选框等能够输入数据的部分。
-
pragma
-
当网页中包含图片时,会在网页中的相应位置嵌入表示图片文件的标签 [①] 的控制信息。浏览器会在显示文字时搜索相应的标签,当遇到图片相关的标签时,会在屏幕上留出用来显示图片的空间,然后再次访问 Web 服务器,按照标签中指定的文件名向 Web 服务器请求获取相应的图片并显示在预留的空间中。这个步骤和获取网页文件时一样,只要在 URI 部分写上图片的文件名并生成和发送请求消息就可以了。
-
这一系列工作的整体指挥也是浏览器的任务之一,而 Web 服务器却毫不知情
-
get 获取 post 发送
1.2.1
-
实际的 IP 地址是一串 32 比特的数字,按照 8 比特(1 字节)为一组分成 4 组,分别用十进制表示然后再用圆点隔开
-
加信息来表示 IP 地址的内部结构。
哪部分是网络号,哪部分是主机号
是一串与 IP 地址长度相同的 32 比特数字,其左边一半都是 1,右边一半都是 0。其中,子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机号
子网掩码表示网络号与主机号之间的边界
-
IP 地址的主机号
全 0:表示整个子网
全 1:表示向子网上所有设备发送包,即“广播”
-
让路由器来使用 IP 地址。为了填补两者之间的障碍,需要有一个机制能够通过名称来查询 IP 地址,或者通过 IP 地址来查询名称 – DNS
Domain Name System
首先,将负责管理下级域的 DNS 服务器的 IP 地址注册到它们的上级 DNS 服务器中,然后上级 DNS 服务器的 IP 地址再注册到更上一级的 DNS 服务器中所以我们可以从根域开始一路往下顺藤摸瓜找到任意一个域的 DNS 服务器。
根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中
-
操作系统的 Socket 库
Socket又称"套接字" -
执行解析(resolution)这一操作的就叫解析器(resolver)了。
-
库就是一堆通用程序组件的集合,其他的应用程序都需要使用其中的组件。库有很多好处。首先,使用现成的组件搭建应用程序可以节省编程工作量;其次,多个程序使用相同的组件可以实现程序的标准化。
解析器就是这个库中的其中一种程序组件 -
公共网关接口(CGI)
-
Socket是什么?
Socket,又称套接字,是Linux跨进程通信(IPC,Inter Process Communication,详情参考:Linux进程间通信方式总结)方式的一种。相比于其他IPC方式,Socket更牛的地方在于,它不仅仅可以做到同一台主机内跨进程通信,它还可以做到不同主机间的跨进程通信。根据通信域的不同可以划分成2种:Unix domain socket 和 Internet domain socket。
-
“IP+端口+协议”的组合就可以唯一标识网络中一台主机上的一个进程。这也是生成socket的主要参数。
半,一个完整的Socket的组成应该是由**[协议,本地地址,本地端口,远程地址,远程端口]
** 组成的一个5维数组
-
从TCP连接视角看待上述过程可以总结如图,可以看到TCP的三次握手代表着Socket连接建立的过程,建立完连接后就可以通过read,wirte相互传输数据,最后四次挥手断开连接删除Socket。
-
TCP*(Transmission Control Protocol,传输控制协议)*
TCP的**三次握手***以及TCP的*四次挥手***! 三次握手*: 建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立, 在Socket编程中,这一过程由客户端执行connect来触发,具体流程图如下:
-
首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道 [③]。当服务器进入等待状态时,客户端就可以连接管道了。具体来说,客户端也会先创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上。当双方的套接字连接起来之后,通信准备就完成了。接下来,就像我们刚刚讲过的一样,只要将数据送入套接字就可以收发数据了。
当数据全部发送完毕之后,连接的管道将会被断开。管道在连接时是由客户端发起的,但在断开时可以由客户端或服务器任意一方发起 [④]。其中一方断开后,另一方也会随之断开,当管道断开后,套接字也会被删除。到此为止,通信操作就结束了。
前面这 4 个操作都是由操作系统中的协议栈来执行的,浏览器等应用程序并不会自己去做连接管道、放入数据这些工作,而是委托协议栈来代劳。
-
服务器程序一般会在启动后就创建好套接字并等待客户端连接管道。
-
小写的 socket 表示程序组件的名称,大写字母开头的 Socket 表示库,而汉字的“套接字”则表示管道两端的接口。
-
在Socket中 connect 时,需要指定描述符、服务器 IP 地址和端口号这 3 个参数
-
如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制
服务器上所使用的端口号是根据应用的种类事先规定好的
-
客户端在创建套接字时,协议栈会为这个套接字随便分配一个端口号 [⑦]。接下来,当协议栈执行连接操作时,会将这个随便分配的端口号通知给服务器。
-
准确地说,IP 地址不是分配给每一台设备的,而是分配给设备中安装的网络硬件的。因此,如果一台设备中安装了多个网络硬件,那么就会有多个 IP 地址。
-
write
接收消息的操作是通过 Socket 库中的 read 程序组件委托协议栈来完成的
调用 read 时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区
当浏览器收到数据之后,收发数据的过程就结束了。接下来,我们需要调用 Socket 库的 close 程序组件进入断开阶段 -
对于同一台服务器来说,重复连接和断开显然是效率很低的,因此后来人们又设计出了能够在一次连接中收发多个请求和响应的方法
-
。