乐趣区

关于java:网络是如何请求的第一章

用户向浏览器输出一条 URL 到响应返回,一条网络申请的生命周期。

全书共分六合局部:

  1. 应用层客户端生成 HTTP,委托给操作系统的协定栈
  2. 协定栈(TCP/IP 模块)调用网卡驱动生成电信号
  3. 网卡如何通过路由器达到用于接入互联网的路由器
  4. 互联网外部接力传输
  5. 达到 web 服务器之后先通过防火墙的查看
  6. web 服务器是如何收取数据的

第一章次要介绍了,客户端利用从解析 URL 到委托协定栈发送的主流程:

  1. 应用层客户端依据 url 协定格局取出,域名或 ip,port,URL, 申请参数等信息
  2. 依照 HTTP 协定生成申请音讯
  3. 发送音讯之前,须要晓得对方的 IP, 委托 DNS 客户端解析器应用域名通过 DNS 服务器获取 IP
  4. 应用 Socket 库委托协定栈(TCP/IP)发送申请

次要看点如下:

  1. 生成 HTTP 音讯

    1. 用户向浏览器输出了一个网址 (URL),浏览器是如何解析这个网址(URL) 的呢
    2. 浏览器依据 URL 生成一条 HTTP 音讯,HTTP 音讯具体长啥样呢?
  2. 向 DNS 服务器获取 web server IP

    1. 在浏览器是如何通过域名来查找 IP 的
  3. 寰球 DNS 服务器大接力

    1. 上万台的 DNS 是如何接力实现 IP 查问的
  4. 委托协定栈发送音讯

    1. 协定栈是什么
    2. 具体是如何委托的

生成 HTTP 申请信息

浏览器输出网址(URL)

URL Uniform Resource Locator 对立资源定位器

URL 格局 — 协定类型:// 协定格局

用 HTTP 协定拜访 Web 服务器时
http://user:password@www.glasscom.com:80/dir/file1.htm
http://[用户名]:[明码]@web 服务器域名:[端口号]文件路径名
​
ftp 上传下载文件
ftp://user:password@ftp.glasscom.com:21/dir/file1.htm
ftp://[用户名]:[明码]@ftp 服务器域名:[端口号]文件路径名
​
file://localhost/c:/path/file.zip
file://[计算机名]文件路径名
​
mailto:tone@glasscom.com
mailto: 邮件地址

HTTP 的基本思路

client ---- 申请音讯[URI| 办法] ---> server
client <--- 响应音讯[状态码]   ---- server

申请音讯包含 对什么 进行怎么的操作

对什么 称为 URI : Uniform Resource Identifier 对立资源标识符, 包含 URL

进行怎么的操作 称为 办法: GET POST …

HTTP 协定格局

申请音讯
< 办法 >< 空格 ><URI>< 空格 ><HTTP 版本 >
< 字段名 >:< 字段值 >
< 字段名 >:< 字段值 >
< 字段名 >:< 字段值 >
...
< 空行 >
< 音讯体 >
响应音讯
<HTTP 版本 >< 空格 >< 状态码 >< 空格 >< 响应短语 >
< 字段名 >:< 字段值 >
< 字段名 >:< 字段值 >
< 字段名 >:< 字段值 >
...
< 空行 >
< 音讯体 >
申请头分类: 通用头(实用于申请头 响应头) 申请头 响应头 实体头
响应码 | 响应短语
1xx | 告知申请解决进度和状况
2xx | 胜利
3xx | 示意须要进一步操作
4xx | 客户端谬误
5xx | 服务器谬误
一条申请中只能写一个 URI, html 和 图片都须要独自的申请
WWW 工作原理, 网页中的文本数据和嵌入其中的图片数据是独立存储 | 离开申请的

向 DNS 服务器查问 Web 服务器的 IP 地址

上一步生成了 HTTP 音讯, 发送之前须要晓得对方服务器的 IP。

DNS: Domain Name System 源码服务器

IP 地址

IP 由网络号和主机号组成,网络号和主机号的分界线由子网掩码划分。

ip 查看指令
windows ipconfig
linux ifconfig

举例说明:
ip: 10.11.12.13
子网掩码: 255.255.255.0
网络号:10.11.12
主机号:13

32 bit, 8 bit 一组

a. IP 地址主体的示意形式
10.11.12.13
IP 地址

b. 子网掩码表达方式
10.11.12.13/255.255.255.0
IP 地址主体 / 子网掩码

c. 采纳网络号比特数示意子网掩码
10.11.12.13/24
IP 地址主体 / 子网掩码

d. 示意子网的地址
10.11.12.0/24
主机号所有比特位都为 0 代表整个子网

d. 示意子网的地址
10.11.12.255/24
主机号所有比特位都为 1 代表对子网进行播送

ip 地址   10.11.12.255
子网掩码 255.255.255.0
子网掩码示意网络号与主机号的边界, 子网掩码 1 的局部示意网络号, 0 的局部主机号

网络号比特数: 24 == 255.255.255.0

域名和 IP 地址并用

人用域名, 容易记
路由器用 IP, 地址长度 32bit 4 字节, 网络传输效率高, 性能好 
note: 如果服务器应用虚拟主机, 可能无奈用 IP 拜访

如何查问 IP

1. 询问最近的 DNS 服务器, 域名会对应 IP
2. DNS 服务器返回 IP
计算机上会有一个 DNS 客户端 称为 DNS 解析器
通过 DNS 查问 IP 被称为域名解析
解析器理论是一段程序, 蕴含在操作系统的 Socket 库中
Socket 库 加州大学伯克利开发的 BSD(UNIX 操作系统)中的 C 语言库, 其余语言参照 Socket 开发了相应的网络库
Socket 库 是用于调用网络性能的程序组件汇合, 网络开发的规范库

BSD (Berkeley Software Distribution,伯克利软件套件)
https://baike.baidu.com/item/BSD/3794498?fr=aladdin

通过 DNS 解析器 向 DNS 服务器 发送查问

< 内存地址 > = gethostbyname("域名");

解析器工作流程

网络应用程序调用解析器时,程序的管制流程会转移到解析器的外部。1. 应用程序调用 DNS 解析器
2. DNS 解析器 生成 DNS 服务器查问音讯,调用协定栈(TCP/IP 驱动)3. 协定栈发送音讯
4. 通过网卡发送音讯给 DNS 服务器。HTTP 音讯用文本, DNS 音讯用二进制

管制流程转移:应用程序调用其余程序,本来运行的程序进入暂停状态,被调用的程序开始运行。

全世界 DNS 服务器 大接力

DNS 服务器的工作流程

1. 接管来自客户端的查问音讯
2. 依据音讯内容返回响应
查问音讯格局
a) 域名
服务器, 邮件服务器 (xxx@xxx.com @前面的这一段) 名称
b) Class
类型永远是代表互联网的 IN
c) 记录类型
A: 服务器
MX(mail eXchange): 邮件服务器
响应音讯格局
记录类型为 A  返回 服务器对应的 IP
记录类型为 MX 返回 邮件服务器对应的优先级和域名

优先级:一个邮件地址对应多个邮件服务器时,数字越小优先级越高
域名 Class 记录类型 响应数据
www.baidu.com IN A xxx.xxx.xxx.xxx
glasscom.com IN MX 10 mail.glasscom.com
mail.glasscom.com IN A xxx.xxx.xxx.xxx

域名层次结构

按域名分层次结构的保留
www.baidu.com 句点分隔, 越靠右层级越高

可间接百度 "域名层次结构"

寻找相应的 DNS 服务器并获取 IP 地址

1. 从下向上注册
2. 从上向下查问
注册
DNS 服务器 A(治理 baidu.com)
DNS 服务器 B(治理 com)

A 注册 baidu.com 以及 A 的 ip 到 B
B 注册 com 以及 B 的 ip 到根服务器(.)

根域服务器的 IP 寄存于所有 DNS 服务器中
根域服务器的 IP 全世界仅 13 个, 应用多台服务器对应一个 IP
查问
客户端先拜访间隔最近的 DNS 服务器 K, K 的 ip 在客户端的 TCP/IP 配置中有

例如 www.baidu.com

K 拜访根域, 返回 com 域所在的 ip
K 拜访 com 域, 返回 baidu 域所在的 ip
K 拜访 baidu 域, 返回 www 域所在的 ip
K 拜访 www 域, 返回 www.lab.glasscom.com 所在的 ip
最初 K 返回 ip 给客户端

DNS 服务器缓存减速

查问域名后 DNS 服务器会进行缓存
域名不存在也会被缓存
DNS 服务器中的缓存信息会设置一个有效期。并会告知客户端,响应后果来自缓存还是治理该域名的服务器
缓存:将应用过的数据寄存在离应用该数据较近的高速存储安装中,以便进步后续访问速度的技术。CPU 和内存之间 磁盘和内存之间 网络缓存

委托协定栈发送音讯

数据收发操作

按顺序调用 Socket 库中的程序组件,向 OS 外部的协定栈收回委托。1. 创立套接字(创立套接字阶段)2. 将管道连贯到服务器套接字(连贯阶段)3. 手法数据(通信阶段)4. 断开连接并删除套接字(断开阶段)能够有客户端服务器任一方发动,通常服务器

< 内存地址 > = gethostbyname("www.baidu.com");
< 描述符 > = socket(<ipv4>, < 流模式 >);
connect(< 描述符 >, < 服务器的 IP 地址和端口号 >, ...);
write(< 描述符 >, < 发送数据 >, < 发送数据长度 >);
< 接收数据长度 > = read(< 描述符 >, < 接收缓冲区 >, ...);
close(< 描述符 >);

这 5 个操作都是应用程序委托 OS 的协定栈来执行的。这些委托操作都是通过调用 Socket 库中的程序组件执行的,Socket 库起到应用程序和协定栈桥梁作用

socket(<ipv4>, < 流模式 >); 附上一篇参数详解(https://blog.csdn.net/lee244868149/article/details/43732025)

TCP 是一种流模式的协定
UDP 是一种数据报模式的协定
本文中 Socket/socket/ 套接字
Socket,示意库
socket,示意程序组件名称
套接字,示意管道两端的接口,网络中不同主机上的利用过程之间进行双向通信的端点的形象。套接字上联利用过程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。

创立套接字

< 描述符 > = socket(<ipv4>, < 流模式 |bio|nio>)

应用程序、操作系统通过套描述符来辨认套接字
通过描述符,协定栈能够找到对应的套接字

连贯阶段

connect(< 描述符 >, < 服务器的 IP 地址 >, < 服务器端口号 >, ...);
描述符:协定栈依据描述符判断应用哪个套接字和服务端的套接字进行连贯,并执行连贯
服务器 IP:辨认服务器
服务器端口:辨认服务器上的套接字

创立套接字时,协定栈会调配一个端口号(也能够指定)。连贯操作时将这个端口号告诉给服务器
调用 connect 时,执行连贯操作。连贯胜利后,协定将将对方 IP PORT 等信息保留在套接字中
描述符、端口号与套接字的关联关系
描述符:应用程序用于辨认套接字的机制
IP+PORT:客户端和服务端之间辨认对方套接字的机制

IP 地址时调配给设施中装置的网络硬件的。如果一台设施有多个网络硬件则有多个 IP
默认端口号
http 80
tomcat 8080
电子邮件 25
通信阶段:传递音讯
write(< 描述符 >, < 发送数据 >, < 发送数据长度 >);
< 接收数据长度 > = read(< 描述符 >, < 接收缓冲区 >, ...);

通过 socket 调用 read write 委托协定栈发送接管信息
接收缓冲区位于应用程序外部,音讯寄存到接收缓冲区相当于转交给了应用程序
断开阶段:收发数据完结
应用程序收到数据,收发数据的过程就完结了。接下来调用 Socket 的 close 进入断开阶段。最终套接字和管道断开,套接字自身会被删除。依据利用品种不同,客户端和服务器哪边先 close。有些利用客户端先执行,有些服务端先执行。
断开流程
HTTP 协定规定:服务器先断开
web 服务器发送完响应音讯后,被动执行断开操作,首先调用 close 断开连接
web 客户端收到断开的信号,进入断开阶段
接下来,浏览器(应用程序)调用 read 接收数据,read 告知浏览器(应用程序)收发数据操作已完结,连贯已断开
浏览器(应用程序)得悉后,调用 close 进入断开阶段
HTTP 1.1 开始连贯复用
理论负责收发音讯的是协定栈、网卡、驱动
退出移动版