前言
这个总结是根据拉勾网上面购买的课程进行自行梳理和总结。课程地址
前段时间面试了几家公司,虽然都是考察的基础和项目,但是面试结果不是特别的理想,还是知识的掌握程度不够牢固,好多问题都是看过,但是当被问到时候,有的是立刻想出来,有的是没有说的太深。所以打算购买一个课程,重新总结和梳理一遍。
思维导图
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延迟
- Nagle算法:
是为了减少广域网的小分组数目,从而减小网络拥塞的出现;
该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去;其中小分组的定义是小于MSS的任何分组;
该算法的优越之处在于它是自适应的,确认到达的越快,数据也就发哦送的越快;而在希望减少微小分组数目的低速广域网上,则会发送更少的分组;
- 延迟ACK:
如果tcp对每个数据包都发送一个ack确认,那么只是一个单独的数据包为了发送一个ack代价比较高,所以tcp会延迟一段时间,如果这段时间内有数据发送到对端,则捎带发送ack,如果在延迟ack定时器触发时候,发现ack尚未发送,则立即单独发送;
延迟ACK好处:
(1) 避免糊涂窗口综合症;
(2) 发送数据的时候将ack捎带发送,不必单独发送ack;
(3) 如果延迟时间内有多个数据段到达,那么允许协议栈发送一个ack确认多个报文段;
- 当Nagle遇上延迟ACK:
试想如下典型操作,写-写-读,即通过多个写小片数据向对端发送单个逻辑的操作,两次写数据长度小于MSS,当第一次写数据到达对端后,对端延迟ack,不发送ack,而本端因为要发送的数据长度小于MSS,所以nagle算法起作用,数据并不会立即发送,而是等待对端发送的第一次数据确认ack;这样的情况下,需要等待对端超时发送ack,然后本段才能发送第二次写的数据,从而造成延迟;
- 关闭Nagle算法:
使用TCP套接字选项TCP_NODELAY可以关闭套接字选项;
如下场景考虑关闭Nagle算法:
(1) 对端不向本端发送数据,并且对延时比较敏感的操作;这种操作没法捎带ack;
(2) 如上写-写-读操作;对于此种情况,优先使用其他方式,而不是关闭Nagle算法:
–使用writev,而不是两次调用write,单个writev调用会使tcp输出一次而不是两次,只产生一个tcp分节,这是首选方法;
–把两次写操作的数据复制到单个缓冲区,然后对缓冲区调用一次write;
–关闭Nagle算法,调用write两次;有损于网络,通常不考虑;
KEEPALIVE
- KeepAlive默认情况下是关闭的,可以被上层应用开启和关闭
- tcp_keepalive_time: KeepAlive的空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2小时)
- tcp_keepalive_intvl: KeepAlive探测包的发送间隔,默认值为75s
- tcp_keepalive_probes: 在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包次数,默认值为9(次)
滑动窗口和流量控制
滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。 TCP协议的滑动窗口具体是怎样控制流量的?
UDP协议
udp是无连接的
UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态。
UDP没有拥塞控制,因此网络出现拥塞不会是源主机的发送速率降低。
UDP支持一对一,一对多,多对一和多对多的相互通信;
UDP的首部开销小,只有8个字节,比TCP的20个字节要短。
HTTP
协议
Method
- get: 获取资源,当前网络中大部分是get
- post: 传输实体主体
- head: 获取报文首部
- put: 上传文件资源,自身不代验证机制,存在安全问题,不经常使用
- patch: 对资源进行部分修改
- options: 查询指定url支持的方法
- connect: 要求和指定url建立通道,使用ssl和tls协议把通信内容加密以后,经网络传输。
- trace: 追踪路径。服务器将通信路径返回给客户端。环回测试。
Header
有四种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。
Cookie
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 经由进行通信,但利用来保证安全,即
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
引用
码农求职小助手公众号
Be the first person to leave a comment!