internet

名词

  • 域名、网址、ip地址、MAC地址、socket(主机+端口)
  • 互联网,子网络,网关
  • 以太网协议、广播、ARP协议、IP协议、UDP协议、TCP协议、路由协议、DHCP协议、DNS协议、HTTP协议
  • 上网设置:本机的IP地址、子网掩码、网关的IP地址、DNS的IP地址

互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。


根域名的知识

  • ICANN 负责管理全世界域名系统的运作。它的一项主要工作,就是规定顶级域名(top level domain,简写为 TLD)(-.com、.net等)。
  • ICANN 的政策是,每个顶级域名都找一个托管商,该域名的所有事项都由托管商负责。Verisign 是 ICANN 最大的托管商(.com、.net 、.name、.gov)。
  • 根域名: 理论上,所有域名查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。事实上也确实如此,ICANN 维护着一张列表,里面记载着顶级域名和对应的托管商。由于 根域名列表 很少变化,大多数《 DNS 服务商》都会提供它的缓存,所以根域名的查询事实上不是那么频繁。
  • DNS 根区: 根域名列表 的正式名称是 DNS 根区(DNS root zone),ICANN 官网可以查看这个根区文件。该文件保存所有顶级域名的托管信息,举例来说,顶级域名.com可以查到13个域名服务器。
  • 根域名服务器: 保存 DNS 根区文件的服务器,就叫做 DNS 根域名服务器(root name server)。一般来说,《本机》都保存一份根域名服务器的 IP 地址的缓存,叫做 name.cache 文件。

DNS 原理入门

  • DNS (Domain Name System 的缩写)的作用非常简单,就是根据域名查出IP地址。你可以把它想象成一本巨大的电话本。
  • 域名的层级: www.example.com(www.example.com.root) 即 主机名(www).次级域名(example).顶级域名(com).根域名(root一般省略)
  • DNS服务器的查询过程: DNS服务器根据域名的层级,进行分级查询。所谓”分级查询”,就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,过程大致如下。
    • 从”根域名服务器”查到”顶级域名服务器”的NS记录和A记录(IP地址)
    • 从”顶级域名服务器”查到”次级域名服务器”的NS记录和A记录(IP地址)
    • 从”次级域名服务器”查出”主机名”的IP地址
    • “根域名服务器”的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面。
  1. 根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问math.stackexchange.com的顶级域名服务器com.的NS记录。最先回复的根域名服务器将被缓存,以后只向这台服务器发请求。
  2. 然后,DNS服务器向这些顶级域名服务器发出查询请求,询问math.stackexchange.com的次级域名stackexchange.com的NS记录。
  3. 然后,DNS服务器向上面这四台NS服务器查询math.stackexchange.com的主机名。
  • DNS的记录类型: A:地址记录(Address),返回域名指向的IP地址。NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。等等。
  • DNS工具: dig ,host ,nslookup ,whois

TCP 协议简介

协议的作用

简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。

数据包的大小

以太网数据包的负载是1500字节,TCP 数据包的负载在1400字节左右。

数据包的编号(SEQ)

发送的时候,TCP 协议为每个包编号(sequence number,简称 SEQ),以便接收的一方按照顺序还原。万一发生丢包,也可以知道丢失的是哪一个包。
第一个包的编号是一个随机数。为了便于理解,这里就把它称为1号包。假定这个包的负载长度是100字节,那么可以推算出下一个包的编号应该是101。这就是说,每个数据包都可以得到两个编号:自身的编号,以及下一个包的编号。接收方由此知道,应该按照什么顺序将它们还原成原始文件。

数据包的组装

TCP 并没有提供任何机制,表示原始文件的大小,这由应用层的协议来规定。比如,HTTP 协议就有一个头信息Content-Length,表示信息体的大小。
对于操作系统来说,就是持续地接收 TCP 数据包,将它们按照顺序组装好,一个包都不少。
操作系统一旦组装好 TCP 数据包,就把它们转交给应用程序。TCP 数据包里面有一个端口(port)参数,就是用来指定转交给监听该端口的应用程序。
应用程序收到组装好的原始数据,以浏览器为例,就会根据 HTTP 协议的Content-Length字段正确读出一段段的数据。这也意味着,一次 TCP 通信可以包括多个 HTTP 通信。(肯定是一对多的关系,这样不会丢包)

慢启动和 ACK

服务器发送数据包,当然越快越好,最好一次性全发出去。但是,发得太快,就有可能丢包。带宽小、路由器过热、缓存溢出等许多因素都会导致丢包。线路不好的话,发得越快,丢得越多。
TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度。
默认情况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。”确认”的英语是 acknowledgement,所以这个确认消息就简称 ACK。

ACK 携带两个信息。

  1. 期待要收到下一个数据包的编号
  2. 接收方的接收窗口的剩余容量
    由于 TCP 通信是双向的,所以双方都需要发送 ACK。两方的窗口大小,很可能是不一样的。

数据包的遗失处理

前面说过,每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。
如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包,即5号包遗失了,从而再次发送这个包。通过这种机制,TCP 保证了不会有数据包丢失。

互联网协议入门

五层模型

互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。
互联网的实现,分成好几层。如何分层有不同的模型,有的模型分七层,有的分四层。我觉得,把互联网分成五层,比较容易解释。
“实体层”(Physical Layer)、”链接层”(Link Layer)、”网络层”(Network Layer)、”传输层”(Transport Layer)、”应用层”(Application Layer)。

实体层

就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。(可以用光缆、电缆、双绞线、无线电波等方式。)

链接层

在”实体层”的上方,确定了0和1的分组方式。

以太网

早期的时候,每家公司都有自己的电信号分组方式。逐渐地,一种叫做”以太网”(Ethernet)的协议,占据了主导地位。
以太网规定,一组电信号构成一个数据包,叫做”帧”(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。
“标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;”数据”则是数据包的具体内容。

MAC地址

发送者和接受者是如何标识呢?以太网规定,连入网络的所有设备,都必须具有”网卡”接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。
首先,一块网卡怎么会知道另一块网卡的MAC地址?回答是有一种ARP协议,可以解决这个问题。

广播

有了MAC地址,系统怎样才能把数据包准确送到接收方?
回答是以太网采用了一种很”原始”的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。这种发送方式就叫做”广播”(broadcasting)。


“广播”的发送方式局限在同一个子网络内。不同的子网络采用”路由”方式发送。”路由”:指如何向不同的子网络分发数据包。
这就导致了”网络层”的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做”网络地址”,简称”网址”。
“网络层”出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。
网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。

网络层

规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。
目前,广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位组成。
习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。这个地址分成两个部分,前一部分代表网络,后一部分代表主机。
处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的。
怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数”子网掩码”(subnet mask)。
所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。
方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
IP数据包与以太网数据包如何组合?IP数据包直接放进以太网数据包的”数据”部分,因此完全不用修改以太网的规格。

ARP协议

ARP协议 –从IP地址得到MAC地址。
这里又可以分成两种情况。第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的”网关”(gateway),让网关去处理。
第二种情况,如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。(以广播的方式发出一个ARP数据包)

端口

我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做”端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
“传输层”的功能,就是建立”端口到端口”的通信。相比之下,”网络层”的功能是建立”主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做”套接字”(socket)。

传输层

现在,我们必须在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做UDP协议,它的格式几乎就是在数据前面,加上端口号。
UDP数据包,也是由”标头”和”数据”两部分组成。然后,把整个UDP数据包放入IP数据包的”数据”部分。


UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。
TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

应用层

“应用层”的作用,就是规定应用程序的数据格式。
举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。
它的数据就放在TCP数据包的”数据”部分。

用户的互联网协议

切换到用户的角度,看看用户是如何从上至下,与这些协议互动的。
数据包的目标地址,实际上分成两种情况:
场景 数据包地址
同一个子网络 对方的MAC地址,对方的IP地址
非同一个子网络 网关的MAC地址,对方的IP地址

用户的上网设置

  1. 静态IP地址:* 本机的IP地址、* 子网掩码、* 网关的IP地址、* DNS的IP地址;手动设置这四个参数。
  2. 动态IP地址:所谓”动态IP地址”,指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议。
    这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做”DHCP服务器”。新的计算机加入网络,必须向”DHCP服务器”发送一个”DHCP请求”数据包,申请IP地址和相关的网络参数。
    前面说过,如果两台计算机在同一个子网络,必须知道对方的MAC地址和IP地址,才能发送数据包。但是,新加入的计算机不知道这两个地址,怎么发送数据包呢?
  3. DHCP协议
    它是一种应用层协议,建立在UDP协议之上,所以整个数据包是这样的:
    • 最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
    • 后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。
    • 最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

接下来,DHCP服务器读出这个特殊包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。
新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数。


上层协议数据包 在 下层协议数据包 的数据部分。

一个实例:访问网页

打开浏览器,在地址栏输入网址:www.google.com 后的通信过程。

  1. DNS协议,知道了对方的IP地址。
  2. 子网掩码,判断这个IP地址是不是在同一个子网络,确定接收方的MAC地址将是网关的MAC地址。
  3. 构造数据包:根据 以太网数据包的数据部分的最大长度、IP数据包的总长度,拆分数据包。(并根据 TCP协议 对 TCP数据包进行编号?)
  4. 服务器端响应,经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

网络访问控制策略,您通过电脑浏览器访问的部分网站域名已被拦截(chrome拦截现象:访问网站后会提示找不到服务器IP)。DNS解析时控制?

如何验证 Email 地址:SMTP 协议入门教程

SMTP 是”简单邮件传输协议”(Simple Mail Transfer Protocol)的缩写,基于 TCP 协议,用来发送电子邮件。
验证 Email 邮箱的基本思路如下。

  1. 找到邮箱所在域名的 SMTP 服务器 –nslookup命令
  2. 连接该服务器 –Telnet 或 Netcat 命令
  3. 询问有没有该邮箱
  4. 如果服务器返回 250 或 251 状态码,邮箱就是真的;如果返回 5xx(500~599),就是假的。

SMTP 协议的常用命令

  • EHLO –向邮件服务器提供连接的域名,也就是邮件将从哪台服务器发来。 如:EHLO example.com
  • MAIL FROM –向邮件服务器提供邮件的来源邮箱。 如:MAIL FROM:mail@example.com
  • RCPT TO –验证邮件地址是否存在。 如:RCPT TO:test@gmail.com

一般来说,状态码 250 和 251 都表示邮箱存在;QUIT命令关闭 TCP 连接。