网络原理(http)(https)

1.HTTP

1.1HTTP 是什么

HTTP (全称为 "超⽂本传输协议") 是⼀种应⽤⾮常⼴泛的 应⽤层协议.

HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议.

HTTP 往往是基于传输层的 TCP 协议实现的. (HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于UDP 实现)

我们平时打开⼀个⽹站, 就是通过 HTTP 协议来传输数据的。

当我们在浏览器中输⼊⼀个 搜狗搜索的 "⽹址" (URL) 时, 浏览器就给搜狗的服务器发送了⼀个 HTTP请求, 搜狗的服务器返回了⼀个 HTTP 响应.

这个响应结果被浏览器解析之后, 就展⽰成我们看到的⻚⾯内容. (这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应⾥就包含了⻚⾯ HTML, CSS, JavaScript, 图⽚, 字体等信息).

所谓 "超⽂本" 的含义, 就是传输的内容不仅仅是⽂本(⽐如 html, css 这个就是⽂本), 还可以是⼀些其他的资源, ⽐如图⽚, 视频, ⾳频等⼆进制的数据

2.理解 "应⽤层协议"

我们已经了解TCP/IP , 已经知道⽬前数据能从客⼾端进程经过路径选择跨⽹络传送到服务器端进程.

2.1HTTP 协议的⼯作过程

当我们在浏览器中输⼊⼀个 "⽹址", 此时浏览器就会给对应的服务器发送⼀个 HTTP 请求. 对⽅服务器收到这个请求之后, 经过计算处理, 就会返回⼀个 HTTP 响应.

事实上, 当我们访问⼀个⽹站的时候, 可能涉及不⽌⼀次的 HTTP 请求/响应 的交互过程.

通过 F12 打开 chrome 的开发者⼯具, 切换到 Network 标签⻚. 然后刷新⻚⾯即可看到如下图效果. 每⼀条记录都是⼀次 HTTP 请求/响应

注意: 当前 搜狗主⻚ 是通过 https 来进⾏通信的. https 是在 http 基础之上做了⼀个加密解密的⼯作

2.2协议格式总结

为什么 HTTP 报⽂中要存在 "空⾏"?

因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空⾏就相当于是 "报头的结束标记", 或者是

"报头和正⽂之间的分隔符".HTTP 在传输层依赖 TCP 协议, TCP 是⾯向字节流的. 如果没有这个空⾏, 就会出现 "粘包问题".

3.HTTP 请求 (Request)

3.1认识 URL

1.URL 基本格式

平时我们俗称的 "⽹址" 其实就是说的 URL (Uniform Resource Locator 统⼀资源定位符).

互联⽹上的每个⽂件都有⼀个唯⼀的URL,它包含的信息指出⽂件的位置以及浏览器应该怎么处理它.

使⽤ ping 命令查看域名对应的 IP 地址

  1. 在开始菜单中输⼊ cmd , 打开 命令提⽰符
  2. 在 cmd 中输⼊ www. baidu.com, 即可看到域名解析的结果.

2.URL 中的可省略部分

协议名 : 可以省略, 省略后默认为 http://

ip 地址 / 域名 : 在 HTML 中可以省略(⽐如 img, link, script, a 标签的 src 或者 href 属性). 省略后表⽰服务器的 ip / 域名与当前 HTML 所属的 ip / 域名⼀致.

端⼝号 : 可以省略. 省略后如果是 http 协议, 端⼝号⾃动设为 80; 如果是 https 协议, 端⼝号⾃动设为443.

带层次的⽂件路径 : 可以省略. 省略后相当于 / . 有些服务器会在发现 / 路径的时候⾃动访问

/index.html

查询字符串 : 可以省略

⽚段标识: 可以省略

3.关于 URL encode

像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.

⽐如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进⾏转义.

⼀个中⽂字符由 UTF-8 或者 GBK 这样的编码⽅式构成, 虽然在 URL 中没有特殊含义, 但是仍然需要进⾏转义. 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号.

转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不⾜4位直接处理),每2位做⼀位,前⾯加上%,编码成%XY格式

"+" 被转义成了 "%2B" urldecode就是urlencode的逆过程

字符 编码/解码 - 锤子在线工具

4.认识 "⽅法" (method)

4.1GET ⽅法

GET 是最常⽤的 HTTP ⽅法. 常⽤于获取服务器上的某个资源.

在浏览器中直接输⼊ URL, 此时浏览器就会发送出⼀个 GET 请求.

另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求

使⽤ Fiddler 观察 GET 请求

观察请求的详细结果

复制代码
GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Not=A?Brand";v="99", "Microsoft Edge";v="151", "Chromium";v="151"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: BIDUPSID=411B855534EF51FAA46F4FD5CAB294FC; PSTM=1780802396; BDUSS=Qyck9YLUwwdU5Qdm55TGZrQXZUdXFRbG5zZ3FIQmxxSmxwTnBwc091OURpSFJxRVFBQUFBJCQAAAAAAQAAAAEAAAAznRR4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEP7TGpD-0xqVk; BDUSS_BFESS=Qyck9YLUwwdU5Qdm55TGZrQXZUdXFRbG5zZ3FIQmxxSmxwTnBwc091OURpSFJxRVFBQUFBJCQAAAAAAQAAAAEAAAAznRR4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEP7TGpD-0xqVk; BD_UPN=12314753; ZFY=zWDylySr2DRX6NQgr:BO9lNTBHTvN2x:BFmkuOJyeuhC4:C; BAIDUID_REF=C032932BBD85D040A8B3B8D9938D9B47:FG=1; H_WISE_SIDS_BFESS=110085_287279_656456_667681_694235_701614_645235_706379_706708_706946_706952_707518_707828_708197_708076_708403_708571_708679_708638_709187_709243_709333_709173_709602_709634_709642_709674_709699_709727_709704_709722_709238_709234_709842_709860_709873_709889_709914_709907_710026_710068_710073_710134_710137_710216_710220_710287_710307_710567_710579_710684_710918_710914_710934_711002_710938_708307_708554_711083_710783_711140_706866_711190_711205_711264_706895_711307_711293_711351_711450_710710_709670_711468_711496_711498_711504_711500_711502_711481_711541_711275_711553_711550_707470_711565_711598_709611_711558_711700_709568_711731_711734_711754_711749_711757_711798_711783_711792_711819_711818_711825_711831_711826_711853_711872_711770_711911_711687_711930_711782_711953_711950_711957_712118_712104_712117_712109_712186_712011_712211_712221_712232_712285_712342_712132_712156_712296_711935_712290_709290_712377_712385_712383_712391_712401_712403_712407_712409_711924_711518_712465_712492_712557_712565_712563_712570_712566_712568_712627_712621_8000071_8000128_8000135_8000146_8000150_8000161_8000163_8000173_8000177_8000179_8000185_8000194; SMARTINPUT=%5Bobject%20Object%5D; BA_HECTOR=8k2g21a125840h840k8181a02185811l755dr28; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; baikeVisitId=217c26bb-046e-4c1f-8b23-46388bab4968; BAIDUID=A0D57B8C6C55529DF411A32385E18D66:FG=1; H_WISE_SIDS=63143_67861_71500_71684_71819_71966_71945_71929_71942_71936_71953_71927_72033_71946_71932_72064_72072_72067_72090_72180_72121_72209_72192_72257_72322_72372_72377_72355_72425_72414_72465_72489_72497_72496_72564_72614_72602_72531_72625_72652_72654_72662_72664_72691_72698_72755_72772_72750_72729_72710_72706_72818_72795_72844_72823_72872; H_PS_PSSID=63143_67861_71440_71500_71684_71819_71966_71945_71929_71942_71936_71953_71927_72033_71946_71932_72064_72072_72067_72093_72090_72180_72121_72209_72192_72257_72322_72372_72377_72355_72425_72414_72465_72489_72497_72496_72514_72517_72527_72564_72614_72602_72531_72625_72652_72654_72662_72664_72691_72698_72755_72772_72750_72729_72710_72706_72818_72795_72844_72823_72872; BAIDUID_BFESS=A0D57B8C6C55529DF411A32385E18D66:FG=1

GET 请求的特点

• ⾸⾏的第⼀部分为 GET

• URL 的 query string 可以为空, 也可以不为空.

• header 部分有若⼲个键值对结构.

• body 部分为空

4.2. POST ⽅法

POST ⽅法也是⼀种常⻅的⽅法. 多⽤于提交⽤⼾输⼊的数据给服务器(例如登陆⻚⾯).

通过 HTML 中的 form 标签可以构造 POST 请求, 或者使⽤ JavaScript 的 ajax 也可以构造 POST 请求.

使⽤ Fiddler 观察 POST ⽅法

点击这个请求, 查看请求详情

复制代码
GET https://v8.chaoxing.com/ HTTP/1.1
Host: v8.chaoxing.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Not=A?Brand";v="99", "Microsoft Edge";v="151", "Chromium";v="151"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://cn.bing.com/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: route=b79eb2c5b4866e0cfd2fa6af4eab6d7b; SESSIONID=E7BE1E339B4F91BA851D6831F500AB7D

POST 请求的特点

• ⾸⾏的第⼀部分为 POST

• URL 的 query string ⼀般为空 (也可以不为空)

• header 部分有若⼲个键值对结构.

• body 部分⼀般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的⻓度由 header 中的 Content-Length 指定.

经典⾯试题: 谈谈 GET 和 POST 的区别

语义不同 : GET ⼀般⽤于获取数据, POST ⼀般⽤于提交数据.

• GET 的 body ⼀般为空, 需要传递的数据通过 query string 传递, POST 的 query string ⼀般为空, 需要传递的数据通过 body 传递

• GET 请求⼀般是幂等的, POST 请求⼀般是不幂等的. (如果多次请求得到的结果⼀样, 就视为请求是

幂等的).

• GET 可以被缓存, POST 不能被缓存. (这⼀点也是承接幂等性)

4.3. 其他⽅法

• PUT 与 POST 相似,只是具有幂等特性,⼀般⽤于更新

• DELETE 删除服务器指定资源

• OPTIONS 返回服务器所⽀持的请求⽅法

• HEAD 类似于GET,只不过响应体不返回,只返回响应头

• TRACE 回显服务器端收到的请求,测试的时候会⽤到这个

• CONNECT 预留,暂⽆使⽤

5.认识请求 "报头" (header)

header 的整体的格式也是 "键值对" 结构.

每个键值对占⼀⾏. 键和值之间使⽤分号分割

Host

表⽰服务器主机的地址和端⼝.

Content-Length

表⽰ body 中的数据⻓度.

Content-Type

表⽰请求的 body 中的数据格式.

Referer

表⽰这个⻚⾯是从哪个⻚⾯跳转过来的

Cookie

Cookie 中存储了⼀个字符串, 这个数据可能是客⼾端(⽹⻚)⾃⾏通过 JS 写⼊的, 也可能来⾃于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据)

Cookie 主要用于三个目的:

  • 会话管理:用户登录状态、购物车内容、游戏比分或服务器需要记住的其他会话相关细节。
  • 个性化:用户偏好,如显示语言和UI主题。
  • 跟踪:记录和分析用户行为。
  1. 清除之前的 cookie

  2. 登陆操作

    登陆请求

    GET https://gitee.com/login HTTP/1.1
    Host: gitee.com
    Connection: keep-alive
    Cache-Control: max-age=0
    sec-ch-ua: "Not=A?Brand";v="99", "Microsoft Edge";v="151", "Chromium";v="151"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    Referer: https://gitee.com/pen-and-painting-chronicles/projects
    Accept-Encoding: gzip, deflate, br, zstd
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
    Cookie: user_locale=zh-CN; oschina_new_user=false; remote_way=http; abymg_id=1_6DF9A1D7E535BEFC4922C72BFEAC000C74C1E95FC5A1F961C9EC260AC783EA08; Serve_State=true; yp_riddler_id=661576e0-2458-40af-b1cb-a038692a19da; __bid_n=19e3ecd63b50144cab9532; remove_bulletin=gitee-maintain-1779174473; BEC=8ddb6c1710618f9098bae11a2ceedd43; tz=Asia%2FShanghai; Hm_lvt_24f17767262929947cc3631f99bfd274=1785489336,1785635764,1785673935,1785920776; HMACCOUNT=897DB4610A52BA42; user_return_to_0=%2Fpen-and-painting-chronicles%2Fprojects; gitee-session-n=dnRRQ1ArbGNjRGlQZnZIVUd4Z0tHVWtmSTRxTlZ3dHBjNGZqS0JrODdBQ0Q4MHNGdGxzc0JqQU96TWVpWFFuMFZKWEZueCtoeHF5cFlsT0ZtR0Z6Y3h3QTVhbnBjTDIrQmcrb3hwYXE0WDNQTWJYclZtYUZSZmRhRkRiOUxBQ2I4U1RNSHlBZ1VZYXNWUVhUN3lvQk83ZnpVT0NFT2prRTlaaTZVL09NaHZWS2NSc2lkT0NQV1MzeWFwS2NYemJhNDNvZERPQ2NlWHN4R05VMXlaUE0wZUEwc2g4RUwrYSttYkNCcllYWGRiMWdBU2liSGcvczkyaHdJRW92c3UwcElhWThHVUIrcTAxWFNaYTNOVGt3U2o5WHI0bjdSWXB0UU8rcWI4cVYwTHI5UEtmOXh4N3YzOWlBdkhVWUhtZjBMbG1JSUIwNFhsNWZYY2Vya3p2bWlsZkxHeVpRajJlazFCUUhMZUE1dEtwMDRtUWxwRFN5dzlVZ3JFeEFVL2QwYlVTT1BIblMwRStNOWdIMUhnSlVsOUdTdlI4eklYdE05QWdBVmFxL3pKNnlUZnFwaE5oVm1pQmFWVjdnazV3Q1lCZDBWUzFQbVNlTEtPN2NsWEs2ZElsSnVMTityQ0pWb2NZVHluRXVjNTJHZmp0VnU2bU5oQVlZL1dLVmFzRTgrOERZY1JOV2xrdS8rbUFDQjNXY09oa1gveGh4dXIwYnZJTnd2ZjdJQytxcE9qWisxeTJkVjAzZlllcFNPQWRJdVhmNTNaeUpKdVdaL2VhK0tWV0NHTXpOYlMvdmduT0pqTEgxOWZqZ2lIbz0tLWhwdjFxMVdNakE2RkliUGhmWHgxL2c9PQ%3D%3D--98c8546cc9df8d573a7921fdd279fff111ef907b; Hm_lpvt_24f17767262929947cc3631f99bfd274=1785921004; nox_jst_v1=2.0_aa95_IS6aGTJnizrzP0AxKDuRPXzjK3gmUvr8OXWW6udvqve05TX479bF0/f3x8ELOcYXxcIhjR21b/y8vni8ouIzDqR/hA1GYdwMpXRLcbYG7KKC2t7za6+bINMd8AcG1RTAP+iM3n1V6nQBub1SSnSTbHeZILQvVR49LvleEke3IDFzM6o2koqq6XGh9+sqLOIGUa8fjVnxb7ScxJNcX/S7mjx2DscW8FCAjzehwzd0xPX6NCPwyFOQ0pRm/crjNUt5g7KbnZ4nEmcoaChlbYZJTdf2d5kVkhe/aWrrW7kNTYU=

登陆响应

复制代码
HTTP/1.1 200 OK
Server: ADAS/1.0.214
Date: Wed, 05 Aug 2026 09:10:38 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Referrer-Policy: same-origin
Strict-Transport-Security: max-age=31536000; includeSubDomains
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Pragma: must-revalidate, no-cache, private
Cache-Control: no-cache
Set-Cookie: oschina_new_user=false; path=/; expires=Sun, 05 Aug 2046 09:10:38 -0000
Set-Cookie: user_return_to_0=%2Fpen-and-painting-chronicles%2Fprojects; path=/
Set-Cookie: gitee-session-n=MEx5WFBUVERDSzVybUtOWUpjdWRHL0NBaENDM1NOOVpyMG1BSDh3QnhxOFVGOWx3cSttS3RBTGpqcWdwOE5qRGNlUXpjWC9sQThtMUpRaENHNHBlQ0crb08wNk4zZm1hUExMT01BVDBnWEhIUmNxR0I3ZFY0K01sQjFYSFJFTnlLRUJ0YnRYb3hYaHp3ZjF5QWoyclFaLzJoS0ltd2lzcXl5SStFMTcwOVN0OTRaQ1l0MUVhdUhqaWhyQTk0YllQMGtDSXh3cC9lVnlHNGZYRUhqL3dXVVk2RXRzVVhiZWRPMHZJaHMzMTNoMnNZWUQ3TnJ2L1RnaVFsVzZCZ2YwQVRIZmlVQ3JVak55dkJxZXdlaUMwVlN5RjlZd3lZYjBiRFVXaEREMkIrM2EwOFhxTjhacXN3MUNUeW1PWjlPbGdZeTFjSk5PaVQ3SkFkSlo5SHdhbC9CTjgrczhxazMvbS9QV0MxOWk3NWdXTDBDZWFoUS91WG50TzB4V1VaWlFpUUFHU3VjR0g2eTJXUkZVQVpJanlMY2lpK000MW9PZWVFMjh3U0NxcXpPUUxoR29UWXdDNXNaWk5aUG94SzV1MGRMb0Yxa1hXVENrOXllRlBZUlZSQnpkTExVWU1TMFpJWkMxNTNRdHM4MUlQZVE5ZkF6WjE2M3U2OHA0OGsxb280RkhpY3R1Y2thNkorV2lTNERGeWI1VGNnYzQwWVZoVHhFV08yYmRBYVM2UUZTdGRBMkVyVEpWS0owcGJ4SlZKNlZaUXMvRDJ1cTUwVFdUVEpEMHhlWUQ4TVRQRm1LaVZhaUtub0h4Ly8wZz0tLUZyVVpicDYvRDI0OUV3ZXpYNXZJanc9PQ%3D%3D--3e05640a2aa4cac1cb7d46cda5bbb859876472fa; domain=.gitee.com; path=/; secure; HttpOnly; SameSite=Lax
X-Request-Id: 935c988243276e32e73864e9a1ea5899
X-Runtime: 0.095124
Vary: Origin
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self' https://*.gitee.com
BDWAF-Request-ID: d5626288-e596-4326-a722-c276c4429a0e
Content-Length: 25085

可以看到, 响应中包含了 3 个 Set-Cookie 属性.

其中我们重点关注第三个. ⾥⾯包含了⼀个 gitee-session-n 这样的属性, 属性值是⼀串很⻓的

加密之后的信息. 这个信息就是⽤⼾当前登陆的⾝份标识. 也称为 "令牌(token)"

  1. 访问其他⻚⾯
    登陆成功之后, 此时可以看到后续访问码云的其他⻚⾯(⽐如个⼈主⻚), 请求中就都会带着刚才获取到
    的 Cookie 信息

    GET https://gitee.com/login/two-factor?verify_token=37d85fd63e81529d7e4d HTTP/1.1
    Host: gitee.com
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    sec-ch-ua: "Not=A?Brand";v="99", "Microsoft Edge";v="151", "Chromium";v="151"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    Referer: https://gitee.com/login
    Accept-Encoding: gzip, deflate, br, zstd
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
    Cookie: user_locale=zh-CN; oschina_new_user=false; remote_way=http; abymg_id=1_6DF9A1D7E535BEFC4922C72BFEAC000C74C1E95FC5A1F961C9EC260AC783EA08; Serve_State=true; yp_riddler_id=661576e0-2458-40af-b1cb-a038692a19da; __bid_n=19e3ecd63b50144cab9532; remove_bulletin=gitee-maintain-1779174473; BEC=8ddb6c1710618f9098bae11a2ceedd43; tz=Asia%2FShanghai; Hm_lvt_24f17767262929947cc3631f99bfd274=1785489336,1785635764,1785673935,1785920776; HMACCOUNT=897DB4610A52BA42; user_return_to_0=%2Fpen-and-painting-chronicles%2Fprojects; Hm_lpvt_24f17767262929947cc3631f99bfd274=1785921040; nox_jst_v1=2.0_1ead_6TNThoi+hJ36D/ayDr5sB+SWFoI7/iBWM47gWTvMF+AHmgGDk+H839bkEK+BzumFFIIL/hkBQz2qgZpVxHlXRH1rLKQgeTKkJC43sBCm7eQ8ZjY8LuVndMU/dnlNUNLJ0v+ZJkClczedVFQ6BVH3cvS7k+RFgBWLp9lD5xe/2RRVd3eDxzobyXyAQIL0SWigxYTFIKZ7xre2gKJDfWuqS45uGS9v8qA0koerexLFireVsJTtChCdqOWvpu3ehz0MPkl3VmgOqcwfX6x67xgwq8GCaZhX0331y5cMGGYrIOY=; gitee-session-n=M3VyTEEwdExsSklTMUxZeVo2anVQNmFhREkxUDZ0aXNrbFU0aVNhbllCOTM3b0YwcG1uajRIa0ZvYUVLN1FON3pxeVBRM1VLU1AvUS9PcmFVSytOUE1OR0JRckNQdFpuWDBjQnpjSkNOTXlhVkFsb0pBb1ZnTVRqcmt6b2RiRXpPV2M0UUNLR1N2RG5wbmxiUEliUjJzOTQ1SEg0T2tkeUFaOS9jd2hyYWs5M2RmSkVUUGRjZFNiV0NvRUp6Ry9oV2l2VXlldjdHb1JoVk5CTEdpd0tHNlRKVWZ5ckxaRm95SkprKy9TZ0RtVHNNcmZxNFU5TkEwMHc4UkFSeHdKY2FyMU9KM3NFMFAwMWd1RklJT0RmeGV5OEJtMzFMT2l0OUZLaXd3R0N5a3R0QUdibFNiQW14cUhvNE55Q1ZTbWEwbUFxbjBzTDhuN2ZHRFJrR1VZcWJ0SUcwQzJESlNrMjZDOEZUUXp3TlcvVGV5NXNYc0U4bGl2dWZKS0JrdmZUaGQ0T2NJWnI2bkpOcUZHNkJVZG5CWXdYMExpWUt6akltUHE1SnUxZFJpeTl0WHYvUkpRUTdPdXZYZ2FxckJ6Z0IyRWsxbHZySTRQM0V1cEFmNmxnVTJ5ZURNTzU5K2dWNHUyNTBPbWhCSXNrM3h3TThNTFgraktmZFdsSHo4UytoempmRlhOckpqRU91Y00vV0J2MFZsSUNhRnFMb0Zlc2RFY20yL0RqL0ZVOWdDUUVuakpmTWVnN3BwTjQxbHVvd2pEM0dMQUFVYm80bkZScVg3M0NpN0w0ZDA5V0REaEhYM1UwRXhMby9iVjdoclMrcXNZaVRINDBub09ub1YxY2htcUZxcEhKdjRjZmlNL2M1WkV3QWdtbVlkR0U5Q1ZaRmtKSEMwQUJIV01ORUVxTk8yY1lvU2dqN3J1QkZwUEN2b3BBOEJuZm11WWFFdXZQUy9qZTVxMFNwUjcxSHlESXJVV2ZPUndzeFhvPS0tcjZaRVJZclF0RW4wSFI2TitpTDlpUT09--c12337dc10c5827155a5d499ebc6ba3eb877398d

请求你中的 Cookie 字段也包含了⼀个 gitee-session-n 属性, ⾥⾯的值和刚才服务器返回的值
相同. 后续只要访问 gitee 这个⽹站, 就会⼀直带着这个令牌, 直到令牌过期/下次重新登陆

理解登陆过程

1 . 到了医院先挂号. 挂号时候需要提供⾝份证, 同时得到了⼀张 "就诊卡", 这个就诊卡就相当于患者的"令牌".

  1. 后续去各个科室进⾏检查, 诊断, 开药等操作, 都不必再出⽰⾝份证了, 只要凭就诊卡即可识别出当前患者的⾝份.

  2. 看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的⾝份和就诊卡的关联就销毁了. (类似于⽹站的注销操作)

  3. ⼜来看病, 可以办⼀张新的就诊卡, 此时就得到了⼀个新的 "令牌"

6.HTTP 响应详解

6.1认识 "状态码" (status code)

状态码表⽰访问⼀个⻚⾯的结果. (是访问成功, 还是失败, 还是其他的⼀些情况...).

以下为常⻅的状态码.

200 OK

这是⼀个最常⻅的状态码, 表⽰访问成功.

404 Not Found

没有找到资源.

403 Forbidden

表⽰访问被拒绝. 有的⻚⾯通常需要⽤⼾具有⼀定的权限才能访问(登陆后才能访问). 如果⽤⼾没有登陆直接访问, 就容易⻅到 403.

405 Method Not Allowed

HTTP 中所⽀持的⽅法, 有 GET, POST, PUT, DELETE 等.

但是对⽅的服务器不⼀定都⽀持所有的⽅法(或者不允许⽤⼾使⽤⼀些其他的⽅法).

500 Internal Server Error

服务器出现内部错误. ⼀般是服务器的代码执⾏过程中遇到了⼀些特殊情况(服务器异常崩溃)会产⽣这个状态码.

504 Gateway Timeout

当服务器负载⽐较⼤的时候, 服务器处理单条请求的时候消耗的时间就会很⻓, 就可能会导致出现超时的情况.【这种情况在双⼗⼀等 "秒杀" 场景中容易出现, 平时不太容易⻅到.】

302 Move temporarily

临时重定向

301 Moved Permanently

永久重定向. 当浏览器收到这种响应时, 后续的请求都会被⾃动改成新的地址.

301 也是通过 Location 字段来表⽰要重定向到的新地址

7.认识响应 "报头" (header)

响应报头的基本格式和请求报头的格式基本⼀致.

类似于 Content-Type , Content-Length 等属性的含义也和请求中的含义⼀致.

响应中的 Content-Type 常⻅取值有以下⼏种:

text/html : body 数据格式是 HTML

text/css : body 数据格式是 CSS

application/javascript : body 数据格式是 JavaScript

application/json : body 数据格式是 JSON

8.认识响应 "正⽂" (body)

正⽂的具体格式取决于 Content-Type. 观察⼏个抓包结果中的响应部分.

  1. text/html

    Server: nginx/1.17.3
    Date: Wed, 05 Aug 2026 09:43:00 GMT

    Content-Type: text/html; charset=utf-8
    Last-Modified: Wed, 05 Aug 2026 10:43:38 GMT
    Connection: keep-alive
    ETag: W/"609ceae6-3206"
    Content-Length: 12806

    body,
    #app {
    height: 100%;
    margin: 0px;
    padding: 0px;
    }
    .chromeframe {
    margin: 0.2em 0;
    background: #ccc;
    color: #000;
    padding: 0.2em 0;
    }
    #loader-wrapper {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 999999;
    }

  2. text/css

    HTTP/1.1 200 OK
    Server: nginx/1.17.3
    Date: Wed, 05 Aug 2026 09:43:00 GMT
    Content-Type: text/css
    Last-Modified: Wed, 06 Aug 2026 09:43:00 GMT
    Connection: keep-alive
    ETag: W/"609ceae6-3cfbe"
    Content-Length: 249790
    @font-face{font-family:element-icons;src:url(../../static/fonts/element-icons.53

  3. application/javascript

    HTTP/1.1 200 OK
    Server: nginx/1.17.3
    Date: Wed, 05 Aug 2026 09:43:00 GMT
    Content-Type: application/javascript; charset=utf-8
    Last-Modified: Wed, 05 Aug 2026 09:43:00 GMT
    Connection: keep-alive
    ETag: W/"609ceae6-427d4"
    Content-Length: 272340
    (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["app"],{0:function(t,

  4. application/json

    HTTP/1.1 200
    Server: nginx/1.17.3
    Date: Wed, 05 Aug 2026 09:43:00 GMT
    Content-Type: application/json;charset=UTF-8
    Connection: keep-alive
    X-Content-Type-Options: nosniff
    X-XSS-Protection: 1; mode=block
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    vary: accept-encoding
    Content-Length: 12268
    {"msg":"操作成功","code":200,"permissions":[] }

9.HTTPS

HTTPS 是什么

HTTPS 也是⼀个应⽤层协议. 是在 HTTP 协议的基础上引⼊了⼀个加密层.
HTTP 协议内容都是按照⽂本的⽅式明⽂传输的. 这就导致在传输过程中出现⼀些被篡改的情况.

你写了一封信,里面写着你的账号、密码、个人信息,白纸黑字没任何遮挡,托驿站伙计送给京城客栈。送信的路要经过十几条街道,路边随便一个路人都能随手拆开信封,一字不差看完你所有隐私;坏人甚至能半路把信换掉,改了你的留言再送给客栈老板,老板完全分不清是不是你原本写的。这就是 HTTP:所有数据明文裸奔,谁都能偷看、篡改。

在互联⽹上, 明⽂传输是⽐较危险的事情!!!

HTTPS 就是在 HTTP 的基础上进⾏了加密, 进⼀步的来保证⽤⼾的信息安全~

"加密" 是什么

加密就是把 明⽂ (要传输的信息)进⾏⼀系列变换, ⽣成 密⽂ .

解密就是把 密⽂ 再进⾏⼀系列变换, 还原成 明⽂ .

在这个加密和解密的过程中, 往往需要⼀个或者多个中间的数据, 辅助进⾏这个过程, 这样的数据称为 密钥 (正确发⾳ yue 四声, 不过⼤家平时都读作 yao 四声) .

加密解密到如今已经发展成⼀个独⽴的学科: 密码学.

⽽密码学的奠基⼈, 也正是计算机科学的祖师爷之⼀, 艾伦·⻨席森·图灵

10.HTTPS 的⼯作过程

既然要保证数据安全, 就需要进⾏ "加密".

⽹络传输中不再直接传输明⽂了, ⽽是加密之后的 "密⽂".

加密的⽅式有很多, 但是整体可以分成两⼤类: 对称加密 和 ⾮对称加密

引⼊对称加密

对称加密其实就是通过同⼀个 "密钥" , 把明⽂加密成密⽂, 并且也能把密⽂解密成明⽂.

>⼀个简单的对称加密, 按位异或

假设 明⽂ a = 1234, 密钥 key = 8888

则加密 a ^ key 得到的密⽂ b 为 9834.

然后针对密⽂ 9834 再次进⾏运算 b ^ key, 得到的就是原来的明⽂ 1234.

(对于字符串的对称加密也是同理, 每⼀个字符都可以表⽰成⼀个数字)

当然, 按位异或只是最简单的对称加密. HTTPS 中并不是使⽤按位异或.

引⼊对称加密之后, 即使数据被截获, 由于⿊客不知道密钥是啥, 因此就⽆法进⾏解密, 也就不知道请求的真实内容是啥了.

但事情没这么简单. 服务器同⼀时刻其实是给很多客⼾端提供服务的. 这么多客⼾端, 每个⼈⽤的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了, ⿊客就也能拿到了). 因此服务器就需要维护每个客⼾端和每个密钥之间的关联关系, 这也是个很⿇烦的事情

⽐较理想的做法, 就是能在客⼾端和服务器建⽴连接的时候, 双⽅协商确定这次的密钥是啥~!

但是如果直接把密钥明⽂传输, 那么⿊客也就能获得密钥了~~ 此时后续的加密操作就形同虚设了.

**因此密钥的传输也必须加密传输! 但是要想对密钥进⾏对称加密, 就仍然需要先协商确定⼀个 "密钥的密钥". 这就成了 "先有鸡还是先有蛋" 的问题了. 此时密钥的传输再⽤对称加密就⾏不通了.

就需要引⼊⾮对称加密

引⼊⾮对称加密

⾮对称加密要⽤到两个密钥, ⼀个叫做 "公钥", ⼀个叫做 "私钥".

公钥和私钥是配对的. 最⼤的缺点就是运算速度⾮常慢,⽐对称加密要慢很多

• 通过公钥对明⽂加密, 变成密⽂

• 通过私钥对密⽂解密, 变成明⽂

也可以反着⽤

• 通过私钥对明⽂加密, 变成密⽂

• 通过公钥对密⽂解密, 变成明⽂

客⼾端在本地⽣成对称密钥, 通过公钥加密, 发送给服务器.

• 由于中间的⽹络设备没有私钥, 即使截获了数据, 也⽆法还原出内部的原⽂, 也就⽆法获取到对称密

• 服务器通过私钥解密, 还原出客⼾端发送的对称密钥. 并且使⽤这个对称密钥加密给客⼾端返回的响应数据.

• 后续客⼾端和服务器的通信都只⽤对称加密即可. 由于该密钥只有客⼾端和服务器两个主机知道, 其他主机/设备不知道密钥即使截获数据也没有意义.

由于对称加密的效率⽐⾮对称加密⾼很多, 因此只是在开始阶段协商密钥的时候使⽤⾮对称加密, 后续的传输仍然使⽤对称加密.

引⼊证书

服务端在使⽤HTTPS前,需要向CA机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如⾝份证,证明服务端公钥的权威性

这个 证书 可以理解成是⼀个结构化的字符串, ⾥⾯包含了以下信息:

• 证书发布机构

• 证书有效期

• 公钥

• 证书所有者

• 签名

• ...

需要注意的是:申请证书的时候,需要在特定平台⽣成查,会同时⽣成⼀对⼉密钥对⼉,即公钥和私钥。这对密钥对⼉就是⽤来在⽹络通信中进⾏明⽂加密以及数字签名的。

相关推荐
showyoui1 小时前
K8s 集群迁移踩坑:Istio 升级后 nginx 403
网络·docker·kubernetes·istio·service_mesh
caimouse1 小时前
tcpip.sys 传输层 (TCP) 详细分析
网络·网络协议·tcp/ip
SendTomo2 小时前
send.wang私传网:P2P直连传大文件首选工具
javascript·网络·网络协议·webrtc·p2p
llllll1522 小时前
HTTP协议全解:从报文结构到HTTPS加密原理
网络协议·http·https
caimouse2 小时前
tcpip.sys 传输层 (UDP) 详细分析
网络·网络协议·udp
珠***格13 小时前
双碳目标下:四可装置如何助力光伏消纳与碳数据上报
网络·人工智能·分布式·安全·边缘计算
mounter62514 小时前
绕过主机:通过 Devmem TCP 运行 RDMA 应用
网络·网络协议·tcp/ip·rdma·devmem
我星期八休息15 小时前
网络编程—网络层
开发语言·前端·网络·人工智能·智能路由器
科力锐品牌君15 小时前
行业龙头|科力锐全链路防勒索 + 多中心容灾方案,构筑河南翔宇医疗业务安全闭环!
网络·数据库·分布式·安全·数据安全·备份