Hyper Text Transfer Protocol
- WWW = URL + HTTP + HTML
IP (Internet Protocal)
IP主要约定了两件事
- 如何定位一台设备
- 如何封装数据报文,以跟其他设备交流(具体内容不关心)
如何获取外网IP
- 租用宽带
- 买一个路由器,用电脑和手机分别连接路由器
- 路由器连上电信的服务器,路由器就会有一个
外网IP,比如14.17.32.211,这是你在互联网中的地址 - 如果重启路由器,有可能被重新分配
外网IP - 手机和电脑的IP是
内网IP
路由器的功能
- 路由器有两个IP,一个外网IP和一个内网IP
- 内网中的设备可以互相访问,但是不能直接访问外网
- 内网设备想要访问外网,就必须经过路由器中转
- 外网中的设备可以互相访问,但是无法访问你的内网
- 外网设备想要把内容送到内网,也必须通过路由器
- 路由器有时候也叫
网关
几个特殊IP
- 127.0.0.1 表示自己
- localhost 通过 hosts 指定为自己
- 0.0.0.0 不表示任何设备
端口
一个比喻
- 麦当劳提供两个窗口,一号快餐,二号咖啡
- 你去快餐窗口点咖啡会被拒绝,让你去另一个窗口
- 你去咖啡窗口点快餐结果一样
一台机器可以提供不同服务
- 要提供 HTTP 服务最好使用 80 端口
- 要提供 HTTPS 服务最好使用 443 端口
- 要提供 FTP 服务最好使用 21 端口
- 一共有 65535 个端口
使用规则
- 0 到 1023(2的10次方减1)号端口是留给系统使用的
- 你只有拥有了管理员权限后,才能使用这 1024 个端口
- 其他端口可以给普通用户使用
- 比如 http-server 默认使用 8080 端口
- 一个端口如果被占用,只能换一个窗口
域名是什么
域名就是对 IP 的别称
- baidu.com 对应什么IP
ping baidu.com
- qq.com 对应什么IP
ping qq.com
- 知识点
- 一个域名可以对应不同IP
- 这个叫做均衡负载,防止一台机器扛不住
- 一个IP可以对应不同域名,共享主机
域名和IP是怎么对应起来的
DNS(域名系统/域名服务)
- 过程(当你输入baidu.com)
- 浏览器会像电信/联通提供的DNS服务器询问该网站对应的IP
- 电信/联通会回答一个IP
- 浏览器会向对应IP的80/443端口发送请求
- 请求内容是查看该网站的首页
- 为什么是 80 或 443 端口
- 服务器默认用 80 提供 http 服务
- 服务器默认用 443 提供 https 服务
- 开发者工具里可以看到具体的端口
额外
- WWW
- www.baidu.com 和 baidu.com 不是同一个域名
- 关系
- com 是顶级域名
- baidu.com 是二级域名(俗称一级域名)
- www.baidu.com 是三级域名(俗称二级)
- 他们是父子关系
- github.io 把子域名 xxx.github.io 免费使用
URL
- HTTPS 默认端口 443, URL 不展示
curl 命令
用 curl 可以发 HTTP 请求
curl -v http://baidu.comcurl -s -v -- https://www.baidu.com
理解以下概念
- url 会被 curl 工具重写,先请求 DNS 获得 IP
- 先进行 TCP 连接,TCP连接成功后,开始发送 HTTP 请求
- 请求内容看一眼
- 响应内容看一眼
- 响应结束后,关闭 TCP 连接
- 真正结束
HTTP
- 规定请求的格式是什么,响应的格式是什么
HTTP 请求与响应
前置条件
- 安装 Node.js 8+
- 理解 IP 和端口
- 理解 URL 路径和查询参数
如何发请求
- 方法
- 用 Chrome 地址栏
- 用 curl 命令
- 概念
- 帮你发请求的工具叫做
用户代理 - 英文名 User Agent
- 帮你发请求的工具叫做
如何做出一个响应
- 需要编程
- Node.js 有一个 http 模块可以做到
- 注意事项
- 这些代码就是服务器代码,一般放在服务器上
- path 是不带查询参数的路径 /x
- query 是查询参数的对象形式 {a:'1'}
- queryString 是查询参数的字符串形式 ?a=1
- pathWithQuery 是带查询参数的路径,一般不用
- request 是请求对象
- response 是响应对象
代码逻辑
- 语法
- `这种字符串` 里面可以回车
- '这种字符串' 里面要回车只能用 \n 表示
- 逻辑
- 每次收到请求都会把中间的代码执行一遍
- 用 if else 判断路径,并返回响应
- 如果是已知路径,一律返回 200
- 如果是未知路径,一律返回 404
- Content-Type 表示内容的
类型/语法 - response.write() 可以填写返回的内容
- response.end() 表示响应可以发给用户了
HTTP 基础概念
请求
- 请求动词 路径加查询参数 协议名/版本
- Host:域名或IP
- Accept: text/html
- Content-Type: 请求体的格式
- 回车
- 请求体(也就是上传内容)
细节
- 三部分:请求行、请求头、请求体
- 请求动词有 GET/POST/PUT/PATCH/DELETE 等
- 请求体在 GET 请求中一般为空
- 文档位于 RFC 2612 第五章
- 大小写不敏感(随意)
响应
- 协议名/版本 状态码 状态字符串
- Content-Type:响应体的格式
- 回车
- 响应体(也就是下载内容)
细节
- 三部分:状态行、响应头、响应体
- 常见的状态码是考点
- 文档位于 RFC 2612 第六章
用 curl 构造请求
curl -v http://127.0.0.1:8888- 设置请求动词
- -X POST
- 注意大小写
- 设置路径和查询参数
- 直接在 url 后面加
- 设置请求头
- -H 'Name:Value' 或者 --header 'Name:Vlue'
- 设置请求体
- -d '内容' 或者 --data '内容'
用 Node.js 读取请求
- 读取请求动词
- request.method
- 读取路径
- request.url 路径,带查询参数
- path 纯路径,不带查询参数
- query 只有查询参数
- 读取请求头
- request.headers['Accept']
- 读取请求体
用 Node.js 设置响应
- 设置响应状态码
- response.statusCode = 200
- 设置响应头
- response.setHeader('Content-Type','text/html')
- 设置响应体
- response.write('内容')
- 可追加内容