文章目录
1.浏览器生成消息
生成HTTP请求消息
-
但实际上除了"http:",网址还可以以其他一些文字开头,例如"ftp:"等
-
浏览器是一个具备多种客户端功能的综合性客户端软件
-
尽管浏览器能够解析网址并生成 HTTP 消息,但它本身并不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来实现
-
HTTP默认端口是80,我们输入URL的时候一般省略了端口号
-
如果一个URL后面没有跟具体的服务器文件名,那么一般会跳到默认的文件,比如index上
-
PUT/DELETE一般用在Restful设计中,在APP和服务器交互中经常用到
-
在浏览器输入地址使用GET方法
-
一条请求消息只能写一个URI,如果需要多个文件,每个文件都需要一个请求
向DNS服务器查询WEB服务器的IP地址
-
通过几个集线器连接在一起的是同一个子网,将子网通过路由器连接起来,形成一个网络
-
现在很多路由器包含了集线器的功能
-
发送者发出的消息先经过子网中的集线器,然后转发到距离最近的路由器,路由器根据目的地来判断下一个路由器
-
通过DNS查询IP地址的操作叫做域名解析
-
如果一个IP地址的主机号全是0,那么这代表的是整个子网
-
对于 DNS 服务器,我们的计算机上一定有相应的 DNS 客户端,而相当于 DNS 客户端的部分称为 DNS 解析器,或者简称解析器,解析器实际上是一段程序,它包含在操作系统的 Socket 库中,当然请求的时候还需要调用操作系统网络协议栈
-
解析器会向DNS服务器发送查询请求,然后将响应的IP地址写到一个内存地址上,浏览器将IP地址取出,交给操作系统即可
-
DNS是基于UDP的
-
HTTP消息是用文本编写的,而DNS消息是使用二进制数据编写的
-
DNS服务器的地址一般都是配置,不需要查找
全世界DNS服务器的大接力
-
像DNS服务器进行查找需要发送三个东西
- 域名
- Class 这个目前都是IN
- 记录类型,比如A是IP地址,MX是邮件服务器
-
在公司内部网络中,所有内部网络DNS信息都可以保存在一台DNS服务器上面,但是在互联网中,一台服务器肯定远远不够
-
DNS查找,我们要搞清楚域名层次,比如www.lab.glass.com 越靠右边表示层次越高,就像com集团glass事业部lab科的www(代表服务器名称)
-
根据域名层次,DNS服务器也可以分为多级,一个DNS服务器可以同时服务于多级,我们以glass.com为例,它的DNS服务器的IP地址需要在com DNS服务器中有注册,这样我们可以通过com DNS服务器查到glass.com保存的DNS服务器地址
-
在com上面还有根域,根域IP地址全世界就13个,所以它们保存在所有DNS服务器中一点也不难
-
我们可以通过缓存来提高速度,比如我们的最近DNS服务器有glass.com DNS服务器的缓存地址,那么就不用再去根域查了,这个缓存是有有效期的,而且DNS会告诉客户端这个响应是来自缓存的
委托协议栈发送消息
-
一个设备有多个网络硬件,就会有多个IP地址
-
客户端在创建套接字时,协议栈会随便给它分配个端口号,在执行连接操作时,会把端口号发送给服务器
-
套接字创建完成后,协议栈会返回一个描述符,应用程序会将收到的描述符存放在内存中。描述符是用来识别不同的套接字的
-
需要委托协议栈将客户端创建的套接字与服务器那边的套接字连接起来。应用程序通过调用 Socket 库中的名为 connect 的程序组件来完成这一操作。这里的要点是当调用 connect 时,需要指定描述符、服务器 IP 地址和端口号这 3 个参数
-
服务器上所使用的端口号是根据应用的种类事先规定好的,仅此而已。比如 Web 是 80 号端口,电子邮件是 25 号端口
-
调用read 时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区
2.用电信号传输 TCP/IP 数据
创建套接字
- 创建套接字的时候,首先分配一个套接字所需的内存空间,然后向其中写入初始状态,把这个套接字的描述符告知应用程序
连接服务器
-
连接实际上是通讯双方交换控制信息
-
我们还需要一块用来临时存放收发数据的内存空间,叫做缓冲区
-
只要数据传输过程在持续,也就是在调用close之前,连接是一直存在的
收发数据
-
为了防止大量的小包,协议栈并不是一收到数据就马上发送出去,而是会将数据存放在内部的发送缓冲区中,但是为了防止时间太长,协议栈内部有一个计时器,达到一定毫秒数就会把网络报发送出去,应用程序也可以选择不使用缓冲区,比如浏览器就不用
-
MTU是一个网络包的最大长度,一般是1500字节
-
MSS除去头部之后网络包的最大长度
-
FCS是帧校验序列
-
在发送的时候,会按包大小限制来对数据进行拆分,会将每一块数据是从头开始的第几个字节放到这个包的头部,也就是序号,起始序号是一个随机的数
-
在得到对方确认之前,发送过的包都会存在缓冲区里面,如果接收方在规定时间没有正确ACK,那么会重传几次,这个规定的时间是TCP动态确定的
-
TCP不是发一个等到ACK之后再发一个,而是利用滑动窗口机制,这个窗口需要由接收方确定,因为接收方知道自己缓冲区能最多接受多少数据,接收方会将自己的窗口大小和ACK合在一起进行返回
-
接收方在发送ACK的时候,只需要发送最后一个ACK就行了,前面的不用发了
-
在发送HTTP请求之后
- 调用read程序获取响应消息
- 控制流程从read转移到协议栈
- 协议栈尝试从缓冲区取出数据并交给应用程序,但这时候缓冲区估计还没收到数据,这时候协议栈会把应用程序的委托暂时挂起直到服务器返回响应消息
- 当发现服务器返回了消息,协议栈会检查数据块和TCP头部的内容,没问题就给服务器ACK
- 协议栈将数据块还原成原始数据交给应用程序
从服务器断开并删除套接字
-
发送端和接收端都可以发起断开过程
-
整体流程就是四次挥手,这里就不赘述了
IP与以太网的包收发操作
包的基本知识
-
发送方包会被发往最近的网络转发设备,转发设备根据包头信息判断接下来向哪个转发设备转发,通过一直转发到达目的地
-
网络中有路由器和集线器两种不同的转发设备
- 路由器,按照IP地址规则,使用IP头部
- 集线器,按照以太网规则,使用MAC头部
- 再次强调目前很多路由器包含集线器的功能
-
路由器中有路由表,根据目的IP查到下一跳的MAC地址,所以在经过路由器的时候,MAC地址会发生变