总体概况
web浏览器-TCP/IP-网卡驱动-集线盒/路由器-电话局-网络运营商-电话局-防火墙-缓存服务器-网卡驱动-TCP/IP-web服务器程序
一、在浏览器中输入网址发生了什么
1、生成 HTTP 请求消息
URL:统一资源定位符
<scheme>://<user>:<pasword>@<host>:<port>/<path>;<params>?<query>#<frag>
http://glasscom.com/dir/file1.htm
URL 表示要访问 www.lab.glasscom.com 这个 Web 服务器上路径名为 /dir/file1.html 的文件,也就是位于 /dir/ 目录下的 file1.html 这个文件
起始行
Headers
Body
请求行/状态行:【请求方法】【请求网址 】【协议版本 】 ——【协议版本】【响应状态码】【状态码描述】
请求头:键值
内容:get请求中通常没有实体
header
Cache - Control ○ 控制缓存的相关信息
Connection ○ 设置发送响应之后TCP连接是否继续保持的通信选项
Via ○ 记录途中经过的代理和网关
请求头
Authorization ○ 身份认证数据
If - Modified - Since ○ 如果希望仅当数据在某个日期之后有更新时才执行请求,可以在这个字段指定希望的日期。一般来说,这个功能的用途在于判断客户端缓存的数据是否已经过期,如果已经过期则获取新的数据
User - Agent ○ ○ 客户端软件的名称和版本号等相关信息
Accept ○ 客户端可支持的数据类型(Content - Type),以MIME 类型来表示
Accept - Charset △ ○ 客户端可支持的字符集
Accept - Encoding △ ○ 客户端可支持的编码格式(Content - Encoding),一般来说表示数据的压缩格式
Accept - Language △ ○ 客户端可支持的语言,汉语为 zh,英语为 en
Host ○ 接收请求的服务器 IP 地址和端口号
If - Match ○ 参见 Etag
If - None - Match ○ 参见 Etag
If - Unmodified - Since ○ 当指定日期之后数据未更新时执行请求
响应头部
Location ○ ○ 表示信息的准确位置。当请求的 URI 为相对路径时,这个字段用来返回绝对路径
Server ○ ○ 服务器程序的名称和版本号等相关信息
WWW - Authenticate ○ ○ 当请求的信息存在访问控制时,返回身份认证用的数据(Challenge)
Accept - Ranges ○ 当希望仅请求部分数据(使用 Range 来指定范围)时,服务器会告知客户端是否支持这一功能
Content - Length ○ ○ 表示消息体的长度
Expires ○ ○ 表示消息体的有效期
Last - Modified ○ ○ 数据的最后更新日期
Etag ○ 在更新操作中,有时候需要基于上一次请求的响应数据来发送下一次请求。在这种情况下,这个字段可以用来提供上次响应与下次请求之间的关联信息。上次响应中,服务器会通过 Etag 向客户端发送一个唯一标识,在下次请求中客户端可以通过 If -Match、If - None - Match、If - Range 字段将这个标识告知服务器,这样服务器就知道该请求和上次的响应是相关的。这个字段的功能和 Cookie 是相同的,但 Cookie 是网景(Netscape)公司自行开发的规格,而 Etag 是将其进行标准化后的规格
2、向 DNS 服务器查询 Web 服务器的 IP 地址
IP地址-DNS域名解析
根据域名查询 IP 地址;
了解 TCP/IP 的基本思路:就是由一些小的子网(子网可以理解为用集线器连接起来的几台计算机,我们将它看作一个单位,称为子网。),通过路由器连接起来组成一个大的网络。这里的将子网通过路由器连接起来,就形成了一个网络。
路由器:一种对包进行转发的设备,数据是以包的形式进行传送的。
集线器:一种对包进行转发的设备,分为中式集线器和交换式集线器
IP地址:是一串32比特的数字,网络号+主机号
通过解析器向DNS服务器发出查询(在编写浏览器等应用程序的时候,写上解析器的程序名称“gethostbyname”以及 Web 服务器的域名“www.lab.glasscom.com”就可以了,这样就完成了解析器的调用)—根据域名查询 IP 地址时,浏览器会使用 Socket 库中的解析器—解析器调用协议栈,协议栈执行发送信息的功能—然后通过网卡将信息发送给DNS服务器—DNS服务器返回响应信息—从响应信息中取出IP地址—放在内存里面—再返回给应用程序
3、DNS服务器的工作
DNS查询信息包括:
(a) 域名 = www.lab.glasscom.com
(b) Class = IN
(c) 记录类型 = A
二、发送消息
物理层——比特
数据链路层——网卡/APR(用于根据 IP 地址查询相应的以太网 MAC 地址)/RAPR
网络层——路由选择,寻址IP/ICMP(网络包传输过程中产生的错误和控制信息)/RIP(路由信息协议)
传输层——TCP/UDP可靠传输数据
会话层
表示层
应用层——HTTP/DNS
1、创建套接字
调用解析器向DNS服务器发送查询消息-浏览器通过Socket库想协议栈发出委托,首先是创建套接字—协议栈会分配一个存放套接字的空间—写入控制信息(描述符)—创建连接
应用程序是通过“描述符”这一类似号码牌的东西来识别套接字的。
在协议栈中有一个存放控制信息的内存空间(IP地址、端口号等),套接字实体:记录用于控制通信操作的各种控制信息(响应时间,是否丢包等等。。),协议栈工作
查看套接字在win7中:-netstat -ano
第一列:通信协议
第二列:计算机本身的IP地址和端口,如果安装了多个网卡,就会显示多个IP地址;0.0.0.0表示不绑定IP地址
第三列:通信对象(远程端)的IP地址和端口号;此外UDP协议中不绑定对方的地址和协议,因此不显示
第四列:通信状态,LISTENING等待对方连接;ESTABLISHED完成连接正在通信。
第五列:PID进程标识符
netstat:显示套接字内容的命令
a :显示正在通信的套接字,还显示包括未开始通信的套接字
n :显示IP地址和端口号
o :显示使用该套接字的的程序PID
2、连接服务器
创建连接的原理:套接字刚刚创建的时候,里面没有存放任何数据,也不知道和谁通信,只有浏览器知道IP地址和端口号,因此要把这些信息高速协议栈/客户端向服务端发起请求,所以需要创建连接。
应用程序调用socket库中的connect组件,调用的时候指定描述符、IP地址、端口号。描述符:应用程序用来识别套接字的机制IP 地址和端口号:客户端和服务器之间用来识别对方套接字的机制。
记录和交换控制信息的头部:TCP头部(20个字节)
源端口号/目的端口号(16字节)
序列号seq(32比特):发送方告知接受方,所有发送数据的第几个字节
确认号ACK(32):接收方告知发送方,已经收到的所有数据的第几个字节
数据偏移量(4):数据的启始位置,头部的长度
保留字段(6)
控制位(6):
窗口(16):接收方告知发送方窗口大小
效验和(16):原来检查是否出现错误
紧急指针(16):紧急处理的数据位置
可选字段(长度可变):很少用
通信操作中使用的控制信息分为两类。
- (1) 头部中记录的信息
- (2) 套接字(协议栈中的内存空间)中记录的信息
当TCP头部创建好之后-委托IP进行发送
浏览器、邮件等一般应用程序收发数据时用 TCP;
DNS 查询等收发较短的控制数据时用 UDP。
3、收发数据
两端的套接字完成连接之后,就进入收发消息的阶段了。在这个阶段,协议栈会将从应用程序收到的数据切成小块并发送给服务器,考虑到通信过程中可能会出错导致网络包丢失,协议栈还需要确认切分出的每个包是否已经送达服务器,对于没有送达的包要重新发送一次。
协议栈不是一收到数据就马上发送的:判断依据:
- 网络包大小:先把数据放在内部的发送缓冲区中,而网络包的数据长度是有限制的,MTU 表示一个网络包的最大长度,在以太网中一般是 1500 字节。MTU 是包含头部的总长度,因此需要从MTU 减去头部的长度,然后得到的长度就是一个网络包中所能容纳的最大数据长度,这一长度叫作 MSS。
- 时间,计时器(类似浏览器一样的应用程序,一般都是直接发送的)
对请求信息进行拆分发送:
1、SYN=1的包发给服务器,包头部包含:初始序列号X和服务端向客户端发送数据时候所用窗口的大小L1
2、返回SYN=1的包,包含序号Y和窗口大小,此外还有ACK号=X+1
3、ACK=Y+1
Ack=长度+序号(随机的)
4、从服务器断开连接并删除套接字
收发消息的操作全部结束之后,接下来要断开服务器的连接并删除套接字。断开操作的本质是当消息收发完成后客户端和服务器相互进行确认的过程,但这个过程并不只是相互确认并删除套接字那么简单,其中有些地方是很有意思的。
5、IP 与以太网的包收发操作
协议栈会与网卡进行配合,将数据切分成小块并封装成网络包,再将网络包转换成电信号或者光信号发送出去。
包=头部(控制信息)+数据
IP 模块负责添加如下两个头部。
(1) MAC 头部:以太网用的头部,包含 MAC 地址
(2) IP 头部:IP 用的头部,包含 IP 地址
6、用 UDP 协议收发数据的操作
TCP 协议有很多方便的功能,比如网络包出错丢失时可以重发,因此很多应用程序都是使用 TCP 协议来收发数据的,但这些方便的功能也有帮倒忙的时候,在这种情况下我们还有另外一种叫 UDP 的协议。这里我们将介绍 UDP 的必要性以及它与 TCP 的差异。