Hypertext Transfer Protocal, aka "HTTP", 中文译作“超文本传输协定”。在讲HTTP之前,讲一些前提知识。
什么是IP(协议)
Internet Protocal主要约定了两件事:
- 如何定位一台设备
- 如何封装数据报文,以跟其他设备交流 协议的具体内容我们并不关心。
几个特殊的IP
127.0.0.1表示自己localhost通过hosts指定为自己- 0.0.0.0不表示任何设备
有了IP,还需要什么?端口
一台服务器可以提供很多服务,每个服务一个号码,这个号码就叫端口号(port)。
总结: IP和端口缺一不可。IP负责定位设备,端口负责定位设备提供的某项服务。比如:百度提供的搜索服务,QQ提供的聊天服务,网易邮箱提供的邮件服务,等等等等都是可以通过IP和端口实现精确定位的。
什么是域名?
域名就是对IP的别称。
baidu.com对应什么IP?可以在cmd输入ping baidu.com获悉。其他网站类似方法。(关于ping的来源感兴趣可以看这篇博客, 大概意思就是灵感来源于声纳,发射一个信号ping,必收到一个反馈pong)
知识点:
- 一个域名可以对应不同IP,这个叫负载均衡策略,防止服务器扛不住压力
- 一个IP可以对应不同域名,这个叫共享主机,资金不足的公司或个人会这么做
域名和IP是怎么对应起来的?
通过DNS(Domain Name System, 域名系统)。
过程如下:
- 当你输入bilibili.com,你的chrome浏览器会向电信运营商提供的DNS服务器询问目标网址对应的具体IP
- 电信运营商会回答一个IP(本地可以模拟这个过程:在cmd输入
nslookup bilibili.com可以获悉服务器IP地址) - 然后chrome才会向对应IP的80/443端口发送请求,请求内容是查看bilibili.com的首页(服务器默认用80提供http服务,443提供https服务,你可以在开发者工具里看到具体的端口)
题外话
- (www.xiedaimala.com) 和 (xiedaimala.com) 不是同一个域名
- com是顶级域名,xiedaimala.com是二级域名(俗称一级域名),www.xiedaimala.com 是三级域名(俗称二级)。它们是父子关系。
- github.io把子域名xxx.github.io免费给用户使用
所以需要知道 www.xiedaimala.com 和 xiedaimala.com 可以不是同一家公司,也可以是
所以www基本上是多余的
什么是URL?
Uniform Resource Locator,统一资源定位符。
URL = 协议 + 域名或IP + 端口号 + 路径 + 查询字符串 + 锚点
举个栗子
通过锚点可以做到同一个内容,不同位置,比如:
developer.mozilla.org/zh-CN/docs/…
developer.mozilla.org/zh-CN/docs/…
需要注意:锚点看起来有中文,但实际不支持中文。#参考书会被编码。
此外锚点是无法在Network面板看到的,因为锚点不会传给服务器。锚点是面向用户、方便用户的,并不面向服务器,服务器会把锚点吃掉,传给前端的就是锚点之前的url地址里的内容。
HTTP(协议)
用curl命令可以发送http请求。
curl -v http://baidu.com
curl -s -v -- https://www.baidu.com
理解curl命令做了什么:
- url会被curl工具重写,先请求DNS获得IP
- 先进性TCP连接,TCP连接成功后,开始发送HTTP请求
- 请求内容看一眼
- 响应内容看一眼
- 响应结束后,关闭TCP连接(后台进行,我们看不到)
- 真正结束 HTTP规定了请求的格式是什么(图中的五个大于号部分),响应的格式是什么(图中的小于号部分)