首页
首页
文章目录
  1. 前言
  2. 思维导图
  3. 4/7层网络模型
  4. TCP协议
    1. 三次握手
    2. 四次挥手
    3. Nagel算法和ACK延迟
    4. KEEPALIVE
    5. 滑动窗口和流量控制
  5. UDP协议
  6. HTTP
    1. 协议
      1. Method
      2. Header
      3. Cookie
      4. URlEncode
    2. 状态码
      1. 1XX 信息
      2. 2XX 成功
      3. 3XX 重定向
      4. 4XX 客户端错误
      5. 5XX 服务器错误
    3. HTTPS
    4. HTTP2
  7. QUIC
  8. 引用

计算机网络部分

前言

这个总结是根据拉勾网上面购买的课程进行自行梳理和总结。课程地址

前段时间面试了几家公司,虽然都是考察的基础和项目,但是面试结果不是特别的理想,还是知识的掌握程度不够牢固,好多问题都是看过,但是当被问到时候,有的是立刻想出来,有的是没有说的太深。所以打算购买一个课程,重新总结和梳理一遍。

思维导图

思维导图

4/7层网络模型

模型

TCP协议

三次握手

模型

首先建立链接前需要 Server 端先监听端口,因此 Server 端建立链接前的初始状态就是 LISTEN 状态,这时 Client 端准备建立链接,先发送一个 SYN 同步包,发送完同步包后,Client 端的链接状态变成了 SYN_SENT 状态。Server 端收到 SYN 后,同意建立链接,会向 Client 端回复一个 ACK。

由于 TCP 是双工传输,Server 端也会同时向 Client 端发送一个 SYN,申请 Server 向 Client 方向建立链接。发送完 ACK 和 SYN 后,Server 端的链接状态就变成了 SYN_RCVD。

Client 收到 Server 的 ACK 后,Client 端的链接状态就变成了 ESTABLISHED 状态,同时,Client 向 Server 端发送 ACK,回复 Server 端的 SYN 请求。

Server 端收到 Client 端的 ACK 后,Server 端的链接状态也就变成了的 ESTABLISHED 状态,此时建连完成,双方随时可以进行数据传输。

四次挥手

模型

TCP 链接的关闭,通信双方都可以先发起,我们暂且把先发起的一方看作 Client,从图中看出,通信中 Client 和 Server 两端的链接都是 ESTABLISHED 状态,然后 Client 先主动发起了关闭链接请求,Client 向 Server 发送了一个 FIN 包,表示 Client 端已经没有数据要发送了,然后 Client 进入了 FIN_WAIT_1 状态。

Server 端收到 FIN 后,返回 ACK,然后进入 CLOSE_WAIT 状态。此时 Server 属于半关闭状态,因为此时 Client 向 Server 方向已经不会发送数据了,可是 Server 向 Client 端可能还有数据要发送。

当 Server 端数据发送完毕后,Server 端会向 Client 端发送 FIN,表示 Server 端也没有数据要发送了,此时 Server 进入 LAST_ACK 状态,就等待 Client 的应答就可以关闭链接了。

Client 端收到 Server 端的 FIN 后,回复 ACK,然后进入 TIME_WAIT 状态。TIME_WAIT 状态下需要等待 2 倍的最大报文段生存时间,来保证链接的可靠关闭,之后才会进入 CLOSED 关闭状态。而 Server 端收到 ACK 后直接就进入 CLOSED 状态。

Nagel算法和ACK延迟

  1. Nagle算法:

是为了减少广域网的小分组数目,从而减小网络拥塞的出现;

该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去;其中小分组的定义是小于MSS的任何分组;

该算法的优越之处在于它是自适应的,确认到达的越快,数据也就发哦送的越快;而在希望减少微小分组数目的低速广域网上,则会发送更少的分组;

  1. 延迟ACK:

如果tcp对每个数据包都发送一个ack确认,那么只是一个单独的数据包为了发送一个ack代价比较高,所以tcp会延迟一段时间,如果这段时间内有数据发送到对端,则捎带发送ack,如果在延迟ack定时器触发时候,发现ack尚未发送,则立即单独发送;

延迟ACK好处:

(1) 避免糊涂窗口综合症;

(2) 发送数据的时候将ack捎带发送,不必单独发送ack;

(3) 如果延迟时间内有多个数据段到达,那么允许协议栈发送一个ack确认多个报文段;

  1. 当Nagle遇上延迟ACK:

试想如下典型操作,写-写-读,即通过多个写小片数据向对端发送单个逻辑的操作,两次写数据长度小于MSS,当第一次写数据到达对端后,对端延迟ack,不发送ack,而本端因为要发送的数据长度小于MSS,所以nagle算法起作用,数据并不会立即发送,而是等待对端发送的第一次数据确认ack;这样的情况下,需要等待对端超时发送ack,然后本段才能发送第二次写的数据,从而造成延迟;

  1. 关闭Nagle算法:

使用TCP套接字选项TCP_NODELAY可以关闭套接字选项;

如下场景考虑关闭Nagle算法:

(1) 对端不向本端发送数据,并且对延时比较敏感的操作;这种操作没法捎带ack;

(2) 如上写-写-读操作;对于此种情况,优先使用其他方式,而不是关闭Nagle算法:

–使用writev,而不是两次调用write,单个writev调用会使tcp输出一次而不是两次,只产生一个tcp分节,这是首选方法;

–把两次写操作的数据复制到单个缓冲区,然后对缓冲区调用一次write;

–关闭Nagle算法,调用write两次;有损于网络,通常不考虑;

KEEPALIVE

  1. KeepAlive默认情况下是关闭的,可以被上层应用开启和关闭
  2. tcp_keepalive_time: KeepAlive的空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2小时)
  3. tcp_keepalive_intvl: KeepAlive探测包的发送间隔,默认值为75s
  4. tcp_keepalive_probes: 在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包次数,默认值为9(次)

滑动窗口和流量控制

滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。 TCP协议的滑动窗口具体是怎样控制流量的?

UDP协议

  1. udp是无连接的

  2. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态。

  3. UDP没有拥塞控制,因此网络出现拥塞不会是源主机的发送速率降低。

  4. UDP支持一对一,一对多,多对一和多对多的相互通信;

  5. UDP的首部开销小,只有8个字节,比TCP的20个字节要短。

HTTP

协议

Method

  • get: 获取资源,当前网络中大部分是get
  • post: 传输实体主体
  • head: 获取报文首部
  • put: 上传文件资源,自身不代验证机制,存在安全问题,不经常使用
  • patch: 对资源进行部分修改
  • options: 查询指定url支持的方法
  • connect: 要求和指定url建立通道,使用ssl和tls协议把通信内容加密以后,经网络传输。
  • trace: 追踪路径。服务器将通信路径返回给客户端。环回测试。

有四种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。

​ Cookie实际上是一小段的文字薪资。客户端请求服务器,如果服务器需要记录用户状态,就使用response向客户端浏览器颁发一个Cookie,而客户端浏览器会把Cookie储存起来。当浏览器在请求该网站的时候,浏览器就把请求的网址连同Cookie异同提交给服务器,服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

URlEncode

urlencode是一个函数,可将字符串以URL编码,用于编码处理。

URL编码(URL encoding),也称作百分号编码(Percent-encoding), 是特定上下文的统一资源定位符 (URL)的编码机制。

适用于统一资源标识符(URI)的编码,也用于为”application/x-www-form-urlencoded” MIME准备数据, 因为它用于通过HTTP的请求操作(request)提交HTML表单数据。

原理:

将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。

比如:

空格ASCII码是32,对应16进制是20,那么urlencode编码结果是:%20,但在新标准中空格对应的是+,见RFC-1738

比如:

中ASCII码是-10544,对应的16进制是D6D0,那么urlencode编码结果是:%D6%D0

状态码

状态码

1XX 信息

100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。

2XX 成功

1、 200 OK

2、204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。 一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。

3、206 Partial Content :表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。

3XX 重定向

1、301 Moved Permanently :永久性重定向; 2、302 Found :临时性重定向;

3、303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。

注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方 法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。

4、304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If- Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条 件,则服务器会返回 304 状态码。

5、307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器 不会把重定向请求的 POST 方法改成 GET 方法。

4XX 客户端错误

1、400 Bad Request :请求报文中存在语法错误。

2、401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、

DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。

3、403 Forbidden :请求被拒绝。

4、404 Not Found

5XX 服务器错误

1、500 Internal Server Error :服务器正在执行请求时发生错误;

2、503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处 理请求。

HTTPS

HTTPS:Hypertext Transfer Protocol Secure 超文本传输安全协议 TLS:位于 HTTP 和 TCP 之间的协议,其内部有 TLS 握手协议、TLS 记录协议

HTTPS 经由进行通信,但利用来保证安全,即

HTTPS

1、客户端发送自己支持的加密规则给服务器,代表告诉服务器要进行连接了;

2、服务器从中选出一套加密算法和 hash 算法以及自己的身份信息(地址等)以证书的形 式发送给浏览器,证书中包含服务器信息,加密公钥,证书的办法机构;

3、客户端收到网站的证书之后要做下面的事情:

(1)验证证书的合法性;

(2)如果验证通过证书,浏览器会生成一串随机数,并用证书中的公钥进行加密;

(3)用约定好的 hash 算法计算握手消息,然后用生成的密钥进行加密,然后一起发送给 服务器。

4、服务器接收到客户端传送来的信息,要做下面的事情:

(1)用私钥解析出密码,用密码解析握手消息,验证 hash 值是否和浏览器发来的一致;

(2)使用密钥加密消息;

5、如果计算法 hash 值一致,握手成功。 https 要知道的几个加密算法:

握手的时候使用的非对称加密算法:用来加密握手之后的请求和应答;

传输信息的时候使用的对称加密; 保证数据的完整性用的是 hash 算法(数字签名)

HTTP2

1、http2.0 支持多路复用,同一个连接可以并发处理多个请求,方法是把 http 数据 包拆为多个帧,并发有序的发送,根据序号在另一端进行重组,而不需要一个个 http 请求顺序到达;

2、http2.0 支持服务端推送,就是服务端在 http 请求到达后,除了返回数据之外, 还推送了额外的内容给客户端;

3、http2.0 压缩了请求头,同时基本单位是二进制帧流,这样的数据占用空间更 少;

4、http2.0 适用于 https 场景,因为其在 http 和 tcp 中间加了一层 ssl 层。

QUIC

科普:QUIC协议原理分析

引用

[TCP之Nagle算法&&延迟ACK]

码农求职小助手公众号

支持一下
扫一扫,支持一下,爱你。
  • 微信扫一扫
  • 支付宝扫一扫