三次握手

enter description here

  • 第一次握手:主机A发送位码为syn=1,随机产生seq number= X 的数据包到服务器,主机B由A发送的SYN=1知道,A要求建立联机;
  • 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=Y的包;
  • 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认收到的seq值与发送给A的seq+1是否相等和ack是否为1来判断连接是否建立成功。
    • SYN(synchronous建立联机)
    • ACK(acknowledgement 确认)
    • PSH(push传送)
    • FIN(finish结束)
    • RST(reset重置)
    • URG(urgent紧急)
    • Sequence number(顺序号码)
    • Acknowledge number(确认号码)

为什么要三次

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费

https://blog.csdn.net/piexie8364/article/details/114536504

四次挥手

enter description here

  • 前两次表示客户端停止发消息 后两次表示服务端停止发消息
  • 由客户端发起 首部报文 FIN, ACK 为 1 其序列号为 seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1)此时 客户端 进入 终止状态1
  • 服务端收到消息 确认报文 ACK = 1 ack = u + 1 及自己的序列号 seq = v 进入 CLOSE-WAIT(等待关闭状态)
    • TCP 服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个 CLOSE-WAIT 状态持续的时间。
    • 客户端收到服务器的确认请求后,此时,客户端就进入 FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
  • 由服务端发起 释放链接的报文 FIN, ACK 为 1 ack = u+1 其序列号为 seq = w(在半关闭状态 服务端可能又发送一些数据)
  • 客户端收到 并回复 确认报文 ACK = 1, seq=u+1, ack=w+1 此时客户端进入 TIME-WAIT(时间等待状态)
    • 服务端收到后 会立即进入 CLOSE 状态
    • 客户端会必须经过 2MSL(最长报文段寿命)的时间后 才进入 CLOSED 状态

http

http

  1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  3. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  4. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
  5. 支持B/S及C/S模式。

http2.0

  • 多路复用(即一个tcp/ip连接可以请求多个资源)
  • 首部压缩(http头部压缩,减少体积,HPACK算法压缩)
  • 二进制分帧(在应用层跟传送层之间增加了一个二进制分帧层,改进传输性能,实现低延迟和高吞吐量)
  • 服务器端推送(服务端可以对客户端的一个请求发出多个响应,可以主动通知客户端)
  • 请求优先级(如果流被赋予了优先级,它就会基于这个优先级来处理,由服务器决定需要多少资源来处理该请求。)

http1.0和1.1区别

  • http1.0的时候默认短链接,每一次http操作就建立一次连接

  • http1.1起,默认使用长连接,使用长连接会有这一行Connection: keep-alive,在长连接的情况下,当一个网页打开完成后,客户端和服务端之间用于传输http的tcp连接不会关闭,如果客户端再次访问这个服务器的页面,会继续使用这一条已经建立的连接。

    注意: keep-alive不会永远保持,它有一个持续时间,一般在服务器中配置(如apache),另外长连接需要客户端和服务器都支持时才有效

1.1和2.0的区别

  • http1.1中,每请求一个资源,都是需要开启一个tcp/ip连接的,所以对应的结果是,每一个资源对应一个tcp/ip请求,由于tcp/ip本身有并发数限制,所以当资源一多,速度就显著慢下来
  • http2.0中,一个tcp/ip请求可以请求多个资源,也就是说,只要一次tcp/ip请求,就可以请求若干个资源,分割成更小的帧请求,速度明显提升。

http3

QUIC是基于UDP协议的。

  • 线头阻塞问题的解决更为彻底,
  • 切换网络时连接保持,基于tcp的切换网络时ip会改变无法继续保持连接。而基于UDP的h3可以内建与TCP不同的连接标识方法,在网络完成切换后恢复连接。

https

111

(1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验

(2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发

(3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。

(4)如果找到,那么浏览器就会从操作系统中取出 颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密

(5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比

(6)对比结果一致,则证明服务器发来的证书合法,没有被冒充

(7)此时浏览器就可以读取证书中的公钥,用于后续加密了

一般来说,主要关注的就是SSL/TLS的握手流程,如下(简述):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1. 浏览器请求建立SSL链接,并向服务端发送一个随机数–Client random和客户端支持的加密方法,比如RSA加密,此时是明文传输。 

2. 服务端从中选出一组加密算法与Hash算法,回复一个随机数–Server random,并将自己的身份信息以证书的形式发回给浏览器
(证书里包含了网站地址,非对称加密的公钥,以及证书颁发机构等信息)

3. 浏览器收到服务端的证书后

- 验证证书的合法性(颁发机构是否合法,证书中包含的网址是否和正在访问的一样),如果证书信任,则浏览器会显示一个小锁头,否则会有提示

- 用户接收证书后(不管信不信任),浏览会生产新的随机数–Premaster secret,然后证书中的公钥以及指定的加密方法加密`Premaster secret`,发送给服务器。

- 利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key-`session key`

- 使用约定好的HASH算法计算握手消息,并使用生成的`session key`对消息进行加密,最后将之前生成的所有信息发送给服务端。

4. 服务端收到浏览器的回复

- 利用已知的加解密方式与自己的私钥进行解密,获取`Premaster secret`

- 和浏览器相同规则生成`session key`

- 使用`session key`解密浏览器发来的握手消息,并验证Hash是否与浏览器发来的一致

- 使用`session key`加密一段握手消息,发送给浏览器

5. 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,

之后所有的https通信数据将由之前浏览器生成的session key并利用对称加密算法进行加密 。

1634008147228.png

  1. 客户端访问服务器(比如:https://www.12306.cn),发送ssl版本、客户端支持的加密算法、随机数等消息。
  2. 服务器向客户端发送ssl版本、随机数、加密算法、证书(证书出现了)等消息。
  3. 客户端收到消息后,判断证书是否可信(如何判断可信,看下文介绍),若可信,则继续通信,发送消息包括:从证书中获取服务器端的公钥,对随机数加密,向服务器发送一个随机数;编码改变通知,表示随后信息都将使用双方协定的加密方法和密钥发送;客户端握手结束通知。
  4. 服务器端对数据解密得到随机数,发送消息:编码改变通知,表示随后信息都将使用双方协定的加密方法和密钥发送。

http的缓存$\bigstar$

缓存可以简单的划分成两种类型:强缓存200 from cache)与协商缓存304

区别简述如下:

  • 强缓存(200 from cache)时,浏览器如果判断本地缓存未过期,就直接使用,无需发起http请求
  • 协商缓存(304)时,浏览器会向服务端发起http请求,然后服务端告诉浏览器文件未改变,让浏览器使用本地缓存

cache

csrf、xss

csrf

跨站请求伪造 跨站请求攻击。简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的

XSS

跨站脚本攻击。通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

get和post区别

1、传送方式:get通过地址栏传输,post通过报文传输。

2、传送长度:get参数有长度限制(受限于url长度),而post无限制

3、GET回退无害,POST回退会重复提交数据

4、GET和POST还有一个重大区别,简单的说:GET产生一个TCP数据包;POST产生两个TCP数据包

tcp和udp区别

1、连接方面区别

  • TCP面向连接(如打电话要先拨号建立连接)。
  • UDP是无连接的,即发送数据之前不需要建立连接。

2、安全方面的区别

  • TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。
  • UDP尽最大努力交付,即不保证可靠交付。

3、传输效率的区别

  • TCP传输效率相对较低。
  • UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。

4、连接对象数量的区别

  • TCP连接只能是点到点、一对一的。
  • UDP支持一对一,一对多,多对一和多对多的交互通信。

5、应用场景

  • TCP一般用于文件传输(FTP HTTP 对数据准确性要求高,速度可以相对慢),发送或接收邮件(POP IMAP SMTP 对数据准确性要求高,非紧急应用),远程登录(TELNET SSH 对数据准确性有一定要求,有连接的概念)等等;
  • UDP一般用于即时通信(QQ聊天 对数据准确性和丢包要求比较低,但速度必须快),在线视频(RTSP 速度一定要快,保证视频连续,但是偶尔花了一个图像帧,人们还是能接受的),网络语音电话(VoIP 语音数据包一般比较小,需要高速发送,偶尔断音或串音也没有问题)等等。

OPTIONS请求

当一个请求跨域不是简单请求时就会发送 OPTIONS 请求

可通过Access-Control-Max-Age 预检请求Options缓存的时间

跨域

  • 一般CORS跨域

简单请求

  • 使用下列方法之一:
    GET
    HEAD
    POST

  • Content-Type 的值仅限于下列三者之一:
    text/plain
    multipart/form-data
    application/x-www-form-urlencoded

上面的条件,只要有一点不满足就不是简单请求,例如常见的 application/json

当请求跨域且不是简单请求时,浏览器首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。”预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。

WebSocket

  1. 持久化协议,基于tcp,与http兼容好,可以服务器端主动推送
  • secure: 为true时只能通过https传输

  • domain:子域,在这该子域中才可以访问

  • expires:过期时间

  • SameSite:用来防止CSRF攻击,限制第三方的cookie

    • Set-Cookie: CookieName=CookieValue; SameSite=Strict;
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19

      - Strict:完全禁止第三方cookie

      - Lax: 大部分情况不发送第三方cookie,但是除了导航到目标网址的Get请求。

      - None:原本默认lax,可通过这个可关闭,但必须设置Secure属性(cookie只能通过https协议发送)才能关闭

      ## HTTP头部详解

      ##### Cache-Control头域

      ```js
      Public指示响应可被任何缓存区缓存; 
      Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效; 
      no-cache指示请求或响应消息不能缓存; 
      no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存; 
      max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应; 
      min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应; 
      max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

Connection表示连接状态

请求:

1
2
3
close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。 

keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。

响应:

1
2
3
close(连接已经关闭)。 
keepalive(连接保持着,在等待本次连接的后续请求)。
Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive:300

Content-Type

设置请求体的MIME类型(适用POST和PUT请求)

1
Content-Type: application/x-www-form-urlencoded

状态码

1xx

100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议

2xx

200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档(option预检)

3xx

300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源

4xx

400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止

5xx

500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求