编辑推荐: |
本文主要详细介绍了HTTP请求的详细过程。
本文来自微信公众号平凡人日记 ,由火龙果软件Linda编辑推荐。 |
|
TCP/IP协议基本框架
物理层
无线网、无线路由器、无线网卡等不同的物理介质决定了电信号的传输带宽 、速率、传输距离以及抗干扰性。
双绞线就是普通的平时能够看到的这种网线,又分百兆网线、千兆网线(可以传上千兆的数据)。
光纤有1个G的即千兆光纤,还有万兆光纤,带宽越大、越贵、速度越快。
物理介质会受到环境的影响,传递信号衰减的厉害,比如手机无线上网信号有强弱,就是受到了物理介质的影响。
链路层
网络通信就是把有特定意义的数据通过物理介质传送给对方。
单纯发一堆二进制010101没有什么意义,因为发给对方,对方也不知道什么意思,必须要让信息变得有意义,所以要对二进制进行打包处理。
就像数据编码的时候,字节按gbk编码还是utf-8进行编码,相当于把一堆二进制按照编码表把字节映射成中文或英文。
在这里要发送信息也是一样的,单纯的一堆二进制没有意义,所以必须要把它要变得有意义,这就是链路层对二进制做的处理:标识每组电信号特征,比如这一组发送出去的二进制代表什么?发送给谁?标识了之后,然后分组按顺序把它发送出去。
以太网、网桥就是指的交换机。
标识电信号和分组的规则是什么?
在OSI七层模型标准设计出来的时候,TCP/IP已经被市场认可且已经比较成熟,截止目前为止,市场上大多是用的TCP/IP模型。
数据链路层中的这些协议(标准)叫以太网协议,规定了数据在小型局域网里(比如办公网络),从这台电脑传到另外一台电脑,怎么传的,流程是怎样的。
这一组电信号就是二进制就是一个数据包,一个数据包又称为一桢数据(比如电影录制了多少桢、录视屏可以配置多少桢),配置的桢数可以理解为一秒钟拍摄多少张照片,最少16桢,低于16桢人肉眼就可以看出来图片之间的切换、感觉有点卡了,高于16桢,看不出来是图片之间的切换。
以太网数据包
数据至少46个字节,最多1500个字节。1024个字节等于1KB,一个数据包最多1500个字节,相当于1.5K,这是一个数据包的大小。
如果要发送的数据特别大,需要分成好多个包或多个桢。
尾部固定4个字节用来校验序列,用于确认数据是完整的,确认数据在传输的过程当中是否会损坏。
首部的4个字节也是固定的,包含了目标MAC地址、源MAC地址和类型。
MAC地址是你的电脑在网络中的地址,比如给谁发送消息,要在数据包中写好接收人的MAC地址是什么,我自己的MAC地址是什么,类比发快递的时候写收件人和寄件人。
包首是固定14个字节,包括MAC目的地址 、源地址以及数据类型。
16进制的MAC地址占6个字节,相当于现实生活中的身份证号,用来标识全世界每台电脑的唯一地址。
一个16进制是4位,2个16进制相当于一个字节,比如 a4:83:e7:be:3d:d9 一共6个字节,前3个字节是厂商编号:MAC地址是配置在网卡上面的,每台电脑能上网就有网卡,网卡上面的地址就是MAC地址,所以生产网卡的厂商,要到全球统一的美国的协会那里去注册一个厂商编号,每个厂商生成的网卡MAC地址都从自己的厂商编号开始。
后面3个字节就是网卡流水号,整个加起来可以确保全球是唯一的。
链路层做的事就是把MAC源地址和MAC目标地址放在以太网的包首部,有了以太网首部就可以把这条消息真正发送出去了。
消息怎么真正的发给对方?
最简单的办法就是两人之间扯根网线,还有其他人总不能拉出5根网线吧!那你的电脑也需要5个网口,
这时就需要一个中间传话的,叫交换机,
5台电脑都连着交换机,负责做数据的转发,你只需要发送一条消息,这5台电脑都可以收到,你可以跟其中任何一台电脑通信。
现实中真正的交换机
你发一个消息,五个电脑都收到了,每个电脑会解析数据包,因为这个包里有MAC目标地址和源地址,看是谁发来的,要找谁,其中4台电脑都发现不是找它的,就会丢弃这个消息。
在一个局域网(一个封闭的小网络,比如办公网络), 不是互联网(互联网是全球都连起来),
通信靠广播(发一个包被交换机转发给所有电脑,就是广播 ),所有连接到交换机的设备,都可以收到消息,
然后每个设备都会解包这个消息,检查包头里面的目标MAC地址,如果不是找自己的就丢弃。
是自己就接受消息并处理消息,然后根据自己的想法去决定怎么响应,这样就简单的实现了一个网络的通信。
这样有没有弊端?
一广播别人都可以收到,别人就会很烦,即使不是自己的包,也需要解包看看,就会浪费它的计算资源。
一万台电脑,你吼一嗓子(广播),一万个人都收到,会造成流量浪费,造成网络拥堵,真正有用的信息可能都被你占道了。
交换机一般有24个口(也有48、60个口的),一个口连接一个电脑。
网络内的电脑通过交换机相连,每个网络之间也通过交换机相连,一般建议级联不超过3个。
在一个小网络里广播大家就受不了了,级联这么多,就会造成广播风暴。
怎么解决?
交换机除了做数据转发,还可以对数据流量进行控制。
给每个人广播的时候,先把每个人的mac地址记录下来,交换机有个mac地址表,存着本网络所有电脑的mac地址,通信就变成了单播,单播就是一对一的,消息直接通过交换机发给目标地址,交换机解包之后得到目标MAC地址,直接发给目标设备。可以连上交换机,看到这个地址表,
每个地址对应着交换机的哪个网口。
mac地址表中的地址会定时更新,比如电脑关机了或下线了,会定时清空。
这样就解决了广播的问题,只需要电脑新接进来的时候广播一次,其他的时候不广播。
新电脑进来广播一次,又会出现带宽浪费的情况,并且很容易被黑客所攻击,比如黑掉了你的电脑或黑掉了这个交换机,不断的认为这个电脑是一个新电脑,就不断的广播,很容易把整个网络搞瘫痪了。
那就把大网络分成小网络,小网络之间进行隔离。
村里大喇叭广播,谁谁谁来电话了,对别人是骚扰;很多个村,这个村和那个村隔离,别的村听不到,所以就不会受影响。你想找另外一个村的人,就找另外一个村的村长,让村长在他的村子里广播找人,但我这个村不受影响。
交换机在OSI系统模型中工作在第二层,在TCP/IP模型里面工作在第一层。
网络层的路由器
路由器工作在OSI七层模型中的第三层网络层。
交换机会广播到另外一个网络,但路由器不会,路由器起到了一个网络隔离的效果。
路由器是一个硬件设备,长的和交换机差不多,对不同网络进行一个隔离,防止广播风暴蔓延到其他的网络,但网络与网络之间要通信,路由器也需要实现不同网络之间的数据转发。
交换机有一个mac地址表记录了所有的机器,那路由器是不是也得记录两边网络的所有机器?
那它就会有一个更大的mac地址表,如果路由器要实现不同网络的数据转发的功能就必须知道所有人的mac地址,全球有100多亿个mac地址,显然光用mac地址是解决不了问题的。
身份证上不能通过身份证号确定这个人的地址,所以还需要住址来定位。同样不能只通过MAC地址(类比身份证号)来定位电脑,还需要通过IP地址(类比住址)。
这个10进制的IP地址就相当于身份证上的住址,
路由器只需要存到11这一层级(类比村长这个层级),
IP地址是实际的物理地址,别人可以在在网络中通过这个IP地址找到这个设备。
IP地址构成规则
IP地址是32 bit(一个字节8bit,占4个字节)构成的地址,用4个10进制数表示,每个字节用.隔开。
每个字节8bit能表达的数字范围是0-255(0.0.0.0-255.255.255.255),这是整个IP的范围(IP地址所有的空间范围)。
8个bit即2的8次方=256,从0开始,256个字符。
一个IP地址共32bit,2的32次方大约43亿即全球共有43亿IPv4版本的地址。
这些很显然是不够的,国际分配给中国一共有3.38亿个ipv4地址,每个人都有一个ip地址的话,那就不够了,代表很多人都上不了网了。
为了解决ip地址不够用的问题,科学家搞出了2个方案。
IPV6 128bit的存储,2的128次方,地球上每一粒尘埃都可以分配到一个IPV6的地址。
但让全球那么多系统支持IPV6需要有一个时间周期,那这期间上网怎么办?通过NAT端口映射技术实现了ip共享。
除了IP地址之外还有一个叫端口,一台电脑上有一个ip地址,但可以有好几万个端口,所以搞了这一个技术,可以好几个人共享一个ip,通过ip和端口标识到一台电脑,这就是端口映射,所以目前来说大家上网都是通过NAT端口映射技术。
公司搞一个路由器很多人上网了,其实都是共享一个ip;小区可能一栋楼共享一个ip,和旁边的邻居其实都是共享一个ip,供应商都给分配好了。
一共有43亿ip地址,这些ip地址是分类的。
ip地址是由网络位和主机位构成。
网络位是用来标识网段的,主机位是用来标识具体主机的,山东省菏泽市是一个区域范围,不是具体到某一户,前面只是代表对区域的划分,现实生活中可以叫它地理区域。
ip前面3个代表网络的范围或网段,最后一位才是真正的主机(对应现实中某个区域内的住户)。
网络位是用来标识网段的,比如192.168.11.0,0表示无,这就表示一个网段。
192.168.11.4,前面3个十进制数是标识网段的,4是主机位,标识具体主机。
如果这个网段按地理位置划分,比如中国有3亿多个ip地址,比如192.168这个网段分配到山东区域,
192.168.11.0 这个主机位就一个字节,一个字节最大多少,0-255,包含的主机是2的8次方=256个,但是0是代表网段,0不能用,255也不能用,因255是特殊地址,这是一个广播地址,255地址就相当在11.0这个网段里发了一个广播,这里面的所有机器都能够收到这个广播包,它是不能配置在主机上的,所以你能用的就是1-254,一共有254个主机,11.0里面一共有254个主机。
IP地址的分类
国际上权威机构(IP地址规划局),给中国3.8亿,中国某xxxx局再进行划分,比如192给山东,100给北京,每个地方再自己去分。
IP地址根据网络号和主机号划分,分为A、B、C三类及特殊地址D、E。全0和全1都不用。
A类
A类地址范围(1.0.0.0-126.0.0.0),第一个字节为网络号,后三个字节为主机号,该IP地址的最前面为0,所以A类地址的网络号取值于1-126(黄色的7位网络位加起来是127,所以范围是1-126)之间,一般用于大型网络。
A类地址的网络号占7位、主机号占24位,主机位代表具体的主机,相当于前面这3个字节都能存放主机,一个字节可以存放254个主机,3个字节是2的24次方=1670多万个主机,这是属于大型网络。
国家只会把这种地址分配给电信运营商、中国移动、联通,比如中国移动从国家分给的地址范围中再提供给好几亿用户使用。
B类
B类地址范围(128.0.0.0-191.255.0.0),前2个字节是网络号,后2个字节为主机号,该IP地址最前面是10,地址的网络号取值于128-191之间,一般用于中等规模的网络。
C类
C类地址范围(192.0.0.0-233.255.255.0),前3个字节是网络号,最后一个字节是主机号,该类IP的最前面是110,地址的网络号取值于192-233之间,一般用于小型网络。
c类是只有一个字节是主机位,前面这些都是网络位,每个c类地址的网段只能存254个主机。
D类
D类是多播地址,该类IP地址的最前面为1110,地址的网络号取值于224-239之间,一般用于多路广播用户。
前面是224到239,后面都是255,只要看到一个地址带着255的,它就是一个广播地址。
192.168.1.255代表1网段的所有主机都可以收到这个广播,就会引起广播风暴,因为不断的发广播包,就会把网络拥堵塞。
这个其实咱们一般用不到,比如路由器或交换机做一些广播的时候可能用得到。
局域网IP地址(私有地址)范围
在IP地址的三种主要分类中,各保留了3个区域作为私有地址,仅能在局域网使用,其地址范围如下:
A类地址
10.0.0.0-10.255.255.255
B类地址
172.16.0.0-172.31.255.255
C类地址
192.168.0.0-192.168.255.255
回环地址
127.0.0.1也是本机地址,等效于localhost或本机ip。
我们电脑上配置的地址,一般都是私有地址。
大型的局域网就可以用A类的地址,大概有1600多万个地址。
B类一个网段6万5千个,16到31相当于有16个网段,6万5乘以16,也有上百万个。
C类 x.x.1.0有255个,x.x.2.0有255个,所以有255x255共6万多个地址。
规定了只能在局域网里用这些地址,不能用其他的地址,其他地址叫公有地址。
在局域网只能配置私有地址,要上网必须有公有地址,除了私有地址之外的都叫公有地址。
为什么要有私有地址?因为想上网,ip地址不够用,只能出现一个共享技术,
想上网只能通过路由器,路由器可以做NAT映射,这么多人都可以共享一个ip,在局域网里面都是用的私有地址。
严格规定:局域网里只能是私有地址,否则可能会和公有地址冲突,所以局域网里比如用100开头的地址,路由器和电信运营商都不帮你转发,因为你在局域网使用了公有地址。
特殊的B类地址
一个特殊的B类地址段是169.254.0.0/16。
DHCP是分配IP地址的一个服务,插个网线,找到DHCP的服务器,它就自动帮你分配,有时候获取不到地址,就会自动配置一个地址即169.254.0.0/16,这个网段的地址表示没有获取到IP,不能上网。
属于同一个网段(网络号)的叫本地网络,不在同一个网段的就叫远程网络。
子网掩码
A公司100个人要上网,找运营商分配公网地址,假设运营商把193.100.100.0这个网络的地址都给你了,这个网络可以有1-254个地址,100个人上网的话,就会有154个地址浪费了。
B公司有300个人,运营商分配了一个地址193.100.101.0,这个网络共有254个地址,还有100多人没有地址用。
一个人是否可以分配一个ip?不可以,因为ip本来就不够用,所以才有共享上网的技术,多个人多台设备共享这些IP地址;实际情况是A公司只给你分5个公有IP(比如193.100.100.180-185),自己去共享;给B公司分配193.100.100.193-200,不可能让你独享一个网段,实际上都是属于这个100网段的,有250个主机,这2个公司共享,这样看起来表面没有问题,当交换机发一个广播,这个网络里的所有主机都可以收到。
为了解决这个问题,就有了路由器,路由器帮你把网络隔开,网与网之间通过路由器转发出去,路由器工作的IP层就是通过IP地址发一个广播,如果A和B公司都能收到,就意味着如果A公司中病毒了,B公司跟着遭殃。
对于开发者来讲,只使用标准库进行网络开发,那是见自己;如果你了解背后的原理再进行开发,那是见天地;如果你了解原理并进行了创新,比如说开发出来自己的网络通信协议
,那是见众生。
http状态码的含义
200-300之间的状态码代表一切正常;
300-400的状态码代表转向了别的地方,例如301是永久重定向 ,302是临时重定向,304是带参数重定向(如果参数不满足,则从缓存中拿已有的结果);
400-500之间代表你的错,比如404,表示你输入错的网址;
500-600代表是网站的错,网站服务器内部出现了问题。
耗时2.5秒表示从点击回车键开始到网站打开需要的所有时间,时间线以4种颜色区分网站打开过程中的每个阶段,第一个阶段是初始连接阶段,
因为发生在瞬间,导致只能看到三个颜色的标记;
第二个紫色表示SSL加密协议密钥的阶段;
第三个绿色是服务器准备内容的阶段;
第四个蓝色代表下载内容阶段;
从域名开始了解具体发生了什么
域名组成部分中,域名的末尾从斜杆开始,代表着要访问网站其他地方的路径;
斜杆代表要访问网站的默认索引页,比如网站首页;
斜杆➕字母、数字等组成的路径表示网站的其他地方;
域名的主题部分,好比存储在通信录中的人名,每个联系人都对应着自己的电话号码,域名也一样,它对应的有相应服务器的ip,这样任何人访问网站,就可以知道去哪个服务器里要我们想看到的东西。
通常验证是否和服务器互通使用ping命令
除了服务器禁ping的情况,ping不超时就说明可以和服务器相互交互,命令中参数-c 4表示和服务器交互了4次。
ping域名的后面,出现了ip地址,相当于在地址栏输入网址按下回车,第一件事就是去找域名对应的服务器地址,这个ip地址是从DNS服务器里存储的地址本里找出来的,如果你访问过该网站,就从本机缓存的数据里找,如果找不到就从路由器设置的电信服务商提供的DNS服务器中找,
如果还找不到,就从网站域名服务商提供的DNS服务器中找,所以DNS域名服务器存储的地址本是分布式的,可以用nslookup命令验证下。
如何从DNS查询域名对应的ip
使用nslookup得到应答,可以看到给b站域名响应了4、5个地址,大概率是因为b站的流量巨大,使用了CDN做了资源加速,让你从最近的服务器中提取资源。
将DNS服务器的设置为8.8.8.8
b站的响应结果是一样的,那起初DNS的域名是谁操作绑定在一起的,当然是b站所属的公司,注册了bilibili的域名,指定好域名的DNS,做好A记录解析来对应好服务器的ip地址,这样就可以通过域名访问b站了。
查看域名的注册信息
whois bilibili
这是域名的注册信息,可以反映出域名注册的过期日期、服务商是阿里云DNS服务器。
域名前的https是超文本传输协议,https代表超文本内容是加密传输的以保证传输的安全。
服务器和客户端的加密协议的协商就对应网络时间轴的紫色部分,
地址栏的小锁图标代表信任的安全认证的加密证书,
证书的使用人、颁发人和证书的有效期以及指纹信息、传输内容的加密是非对称加密、服务器持有密钥、客户端持有公钥、在证书的详细信息标签中可以看到更详细的证书信息,例如证书的签名算法和公钥的路径信息等。
http2协议必须使用加密证书,它保证一个客户端与服务器保持一个连接,比http1.1更高效。
https加密传输每次都是要有协商时间的,说明它比http非加密的方式访问网站要慢。
如果浏览器的要求必须使用加密的方式传输,如果证书过期或者没有使用证书,会将小锁换成不安全警告。
模拟不加密访问
使用的是http1.1非加密协议,请求的是80端口,返回301的状态码,表示b站将域名永久重定向到带www的域名上。
模拟https协议的域名
访问的是443端口,
这里出现了协商密钥交互的握手部分,协商成功之后将使用TLS证书进行加密链接,使用http2的协议进行传输;
这里特别说明下http2协议是http1.1协议的升级版,http2协议必须使用加密证书,它保证一个客户端与服务器只保持一个连接,比http1.1更高效。
互联网之所以互联,是因为它们都是基于TCP/IP协议族进行传输,客户端与服务器的每一次交互都要通过2*7=14到关卡。
OSI七层模型
TCP/IP的OSI 7层模型,虽然它不能代表现实中实际的网络模型但足具代表性。
按照客户端数据流向的方向,从7层模型的最高层讲起:
第7层应用层是由应用程序负责的协议层,比如HTTP/SMTP/POP协议等;
第6层表示层是负责数据的加解密,数据的转换和压缩,例如http协议数据传输中的gzip数据压缩,缩小数据大小以节约网络传输数据的流量;
第5层会话层,例如开发者工具窗口中时间线的紫色部分负责的就是数据加密协议的协商工作,就是在这一层完成的;
第5、6、7层可以统称为应用程序层,在数据向下传输的阶段,在数据段前加入http标头,表示请求的方法是get还是post请求;
第4层就是经典的传输层,负责数据是按照TCP的方式还是按照UDP的方式传输,比如HTTP是按照TCP方式传输的。
这一层会为数据追加20个字节的TCP标头,例如源端口、目标端口、请求序列号。
第三层网络层,负责数据路由的选择和数据分组的传输,典型的IP和IPv6协议就在这一层,这一层会为数据段追加来源IP和目标IP地址,
路由选择,当你输入网址按下回车,找到IP后进入网络层,路由选择是按照你访问的目标服务器的物理距离来决定第二层数据先到哪里,比如你做的是TCP火车还是UDP飞机,从上海到北京你都必须经过江苏安徽河北才能到达是一样的。
模拟路由的选择
下一跳次数越多,说明经停站越多,达到目的地的时间就越长。
这就是为什么使用nslookup查找b站域名ip的时候,会有多个ip,是因为b站为了让用户更快的访问网站使用了CDN技术,选择离你最近的服务器中快速的打开b站。
第二层数据链路层,这一层确保物理层传输的数据帧按需传输,并在这一层加入了来源MAC地址和目标MAC地址标头即网卡,每个网卡都有自己全球唯一的MAC地址确保传输的数据找不错设备,这里的MAC地址不一定是起初访问的设备MAC地址和真正的目的地的服务器的MAC地址,这是由第三层路由选择的下一跳地址决定的。
第一层就是物理层,例如网线、Wi-Fi等方式将你的二进制比特流的数据送出去。
当输入网址按下回车每一次从客户端发送出的请求数据,都会从第7层逐渐处理,加入不同的标头,然后达到目标地址,到达目标地址再反向,从第1层逐层去掉标头,直到网络的第7层,最终服务器拿到干净的请求数据。
知道了数据是怎么流向的,客户端和服务器还要确保数据链路的通畅,它俩必须要建立可靠的链接通道。
三次握手
开发者工具窗口中网络时间轴中瞬间发生的第一个阶段:初始链接阶段,第一次握手是客户端带上序列号x,给服务器打招呼:b站美女你好靓,可以认识下不?
客户端进入SYN-SEND的同步发送状态;
第二次握手服务器监听相关的端口,开通http协议请求端口,类似80和443端口,服务器监听端口收到了消息之后,带上自己的序列号y并带上ack确认码(客户端带来了序列号+1),然后回复:hi,你也好帅哦。
服务器进入SYN_RCVD状态。
第三次握手,客户端收到服务器的回复,带上服务器回复的序列号+1的确认码发送给服务器建立连接成功,就可以愉快的传递数据了。
四次分手
当客户端打算关上连接,会主动带上握手时客户端确认码作为序列号发送给服务器断开连接,客户端进入FIN-WAIT-1状态,发生了一次挥手,服务器收到了分手的消息,会带上自己的序列号v即客户端带来的序列号+1作为确认码回复给客户端。
服务端:分手消息我收到了,我想想,服务端进入CLOSE_WAIT等待关闭的状态,客户端进入继续等待FIN-WAIT-2的状态;然后发生第二次挥手,服务器想了想没有更多的话要给客户端说的,于是带上了序列号w和序列号+1的确认码给客户端发送了分手请求:分手就分手没有什么好说的了,然后服务器进入LAST-ACK最后确认状态;发生了第三次挥手,客户端收到了服务器的分手请求之后,带上+1的序列号和+1的确认码回复给服务器,于是服务器关闭了连接,客户端进入了定时等待时间,这两个报文的最大生存周期,不同的操作系统不一样,大约是1-4分钟即俗称的冷静期,冷静期后客户端才真正的断开。
小结
浏览器输入域名网址首先通过DNS找域名对应的ip地址,然后是三次握手进入初始链接阶段,每次链接都要经过TCP/IP七层模型,
链接初始成功后进入第二阶段SSL的加密协议的证书协商阶段,接下来是服务器准备我们需要的内容,准备好内容之后就是客户端下载内容的阶段。
|