基础知识 之 网络

#**HTTP**
## **HTTP 请求报文**
HTTP请求报文由3部分组成(请求行+请求头+请求体):

**请求行:**
①请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
②请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
③协议名称及版本号。
 
**请求头:**
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。

 

与缓存相关的规则信息,均包含在header中

 
**请求体:**

 

⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。 

## **HTTP 响应报文**
HTTP 响应由四个部分组成: 
1.**状态码(Status Code)**:描述了响应的状态。可以用来检查是否成功的完成了请求。请求失 败的情况下,状态码可用来找出失败的原因。如果 Servlet 没有返回状态码,默认会返回成 功的状态码 HttpServletResponse.SC_OK。 
2.**HTTP 头部(HTTP Header)**:它们包含了更多关于响应的信息。比如:头部可以指定认为 响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。如何在 Serlet 中检索 HTTP 的头部看这里。 

 

3.**空行** 
4.**主体(Body)**:它包含了响应的内容。它可以包含 HTML 代码,图片,等等。主体是由传输 在 HTTP 消息中紧跟在头部后面的数据字节组成的。

 

## **HTTP 请求方法**
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务发送‘*’的请求来测试服务器的功能性。
2、HEAD
向服务器索与 GET 请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET 方法不应当被用于产生“副作用”的操作中,例如在 Web Application 中,其中一个原因是 GET 可能会被网络蜘蛛等随意访问。Loadrunner 中对应 get 请求函数:web_link 和 web_url
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
POST 请求可能会导致新的资源的建立和/或已有资源的修改。
Loadrunner 中对应 POST 请求函数:web_submit_data,web_submit_form
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

## **HTTP 请求过程**
以下是 HTTP 请求/响应的步骤:
1、客户端连接到 Web 服务器 
一个 HTTP 客户端,通常是浏览器,与 Web 服务器的 HTTP 端口(默认为 80)建立 一个 TCP 套接字连接。例如,http://www.oakcms.cn。
 
2、发送 HTTP 请求 
通过 TCP 套接字,客户端向 Web 服务器发送一个文本的请求报文,一个请求报文由 请求行、请求头部、空行和请求数据 4 部分组成。
  
3、服务器接受请求并返回 HTTP 响应
Web 服务器解析请求,定位请求资源。服务器将资源复本写到 TCP 套接字,由客户端 读取。一个响应由状态行、响应头部、空行和响应数据 4 部分组成。 
 
4、释放连接 TCP 连接 
若 connection 模式为 close,则服务器主动关闭 TCP 连接,客户端被动关闭连接, 释放 TCP 连接;若 connection 模式为 keepalive,则该连接会保持一段时间,在该时间内 可以继续接收请求; 
 
5、客户端浏览器解析 HTML 内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响 应头,响应头告知以下为若干字节的 HTML 文档和文档的字符集。客户端浏览器读取响应 数据 HTML,根据 HTML 的语法对其进行格式化,并在浏览器窗口中显示。

## **Get 和 Post 区别**
携带请求参数的方式 
GET: 通过请求行携带参数, 参数会显示在地址栏 
POST: 通过请求体来携带参数, 参数不会显示在地址栏
 
服务器端处理请求的方法 
GET: 会调用 Servlet 的doGet()来处理请求 
POST: 会调用Servlet 的doPost()来处理请求
 
数据大小与安全性 
GET: 不同的浏览器对URL的长度进行了不同的限制, 
因为其传输数据显示在地址栏,因此不安全 
POST: 大小没有限制, 安全
 
编码方式 
GET:URL拼接后,浏览器会对URL进行URLencode,只能发送ASCII字符 
POST:在HTML文件头可以进行charset配置.
 
浏览器的处理方式 
GET:可被缓存,具有幂等性,保留在历史记录中,也可收藏为书签 
POST:不会被缓存,不会保留在浏览器历史记录中,也不能被收藏为书签
## **HTTP 状态码**代码 说明
100 (继续)请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分
正在等待其余部分。
101 (切换协议)
请求者已要求服务器切换协议,服务器已确认并准备切换。
2xx (成功) 表示成功处理了请求的状态代码。
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
300 (多种选择) 针对请求,服务器可执行多种操作。服务器可根据请求者(user agent)选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。
服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置)
请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304(未修改) 自从上次请求后,请求的网页未修改过。
服务器返回此响应时,不会返回网页内容。
305(使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307(临时重定向)
服务器目前从不同位置的网页响应请求,但请求者应继续使用原有
位置来进行以后的请求。
4xx(请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。
400(错误请求) 服务器不理解请求的语法。
401(未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403(禁止) 服务器拒绝请求。
404(未找到) 服务器找不到请求的网页。
405(方法禁用) 禁用请求中指定的方法。
406(不接受) 无法使用请求的内容特性响应请求的网页。
407(需要代理授权)此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408(请求超时)服务器等候请求时发生超时。
409(冲突)
服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410(已删除)如果请求的资源已永久删除,服务器就会返回此响应。
411(需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415(不支持的媒体类型) 请求的格式不受请求页面的支持。
416(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417(未满足期望值)
服务器未满足”期望”请求标头字段的要求。
5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
500(服务器内部错误)服务器遇到错误,无法完成请求。
501(尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502(错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503(服务不可用)) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505(HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
600 源站没有返回响应头部,只返回实体内容


## **[HTTP 长连接 短连接](https://www.cnblogs.com/gotodsp/p/6366163.html) **
短连接:在 HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类 型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每 遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。 长连接:而从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入这行代码: Connection:keep-alive 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据 的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。 Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache) 中设定这个时间。实现长连接需要客户端和服务端都支持长连接。 HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。

## **HTTP 协议是无状态**
HTTP 协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网 页之间没有任何联系。HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保 持 TCP 连接,更不能代表 HTTP 使用的是 UDP 协议(无连接)。
 
具体的一个扫码点菜的场景:
1、用户扫码登录
2、点菜下单
3、在线结账
在用户扫码登录后,http 协议本身是没有保存登录操作进行的http 请求记录,而点菜下单在http请求中将用户的登录信息保存在请求头或者 URL 或者请求体中的,传输到后台,后台根据用户信息查询之前是否进行过登录操作的。
## **HTTP 1.1 与 HTTP 1.0 的区别**
1.http1.0 需要 keep-alive 参数来告知服务器要建立一个长连接,而 http1.1 默认支持长连接 
 
2.HTTP 1.1 支持只发送 header 信息(不带任何 body 信息),如果服务器认为客户端有权限 请求服务器,则返回 100,否则返回 401。客户端如果接受到 100,才开始把请求 body 发 送到服务器。这样当服务器返回 401 的时候,客户端就可以不用发送请求 body 了,节约了 带宽。 
 
3.host 域 http1.0 没有 host 域,http1.1 才支持这个参数。
 
4.带宽优化及网络连接的使用,HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的 一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的 选择以便于充分利用带宽和连接。

## **[HTTP 2.0 与 HTTP 1.0 的区别](https://www.cnblogs.com/heluan/p/8620312.html)**
**新的二进制格式(Binary Format)**,HTTP1.x 的解析是基于文本。基于文本协议的格式解析存在 天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认 0 和 1 的组合。基于这种考虑 HTTP2.0 的协议解析决定采用二进制格式,实现方便且健壮。 
 
**多路复用(MultiPlexing)**,即连接共享,建立起一个连接请求后,可以在这个链接上一直发送,不 要等待上一次发送完并且受到回复后才能发送下一个(http1.0 是这样),是可以同时发送多个请求, 互相并不干扰。 
 
**header 压缩**,如上文中所言,对前面提到过 HTTP1.x 的 header 带有大量信息,而且每次都要重 复发送,HTTP2.0 利用 HPACK 对消息头进行压缩传输,客服端和服务器维护一个动态链表(当一 个头部没有出现的时候,就插入,已经出现了就用表中的索引值进行替代),将既避免了重复 head er 的传输,又减小了需要传输的大小。(Hpack https://www.jianshu.com/p/f44b930cfcac)
 
**服务端推送(server push)**,就是客户端请求 html 的时候,服务器顺带把此 html 需要的 css,js 也一起发送给客服端,而不像 http1.0 中需要请求一次 html,然后再请求一次 css,然后再请求一 次 js。

> 1.http 协议,ajax; 协议的划分 6. http 请求流程 http 长连接设置 短链接 http 怎么记住状态 http 是无状态的怎么来
## **转发与重定向的区别**

**转发过程**:客户浏览器发送 http 请求----》web 服务器接受此请求--》调用内部的一个方法在容 器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一 个 web 容器下的 url,其不能转向到其他的 web 路径上去,中间传递的是自己的容器内的 requ est。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器 做了转发的。转发行为是浏览器只做了一次访问请求。
 
**重定向过程**:客户浏览器发送 http 请求----》web 服务器接受后发送 302 状态码响应及对应新的 location 给客户浏览器--》客户浏览器发现是 302 响应,则自动再发送一个新的 http 请求,请求 url 是新的 location 地址----》服务器根据此请求寻找资源并发送给客户。在这里 location 可以重 定向到任意 URL,既然是浏览器重新发出了请求,则就没有什么 request 传递的概念了。 在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为 是浏览器做了至少两次的访问请求的。

----------
# **TCP UDP**
## **TCP 头部**


Flag : 从左到右,[`URG|ACK|PSH|REST|SYN|FIN`]

 

 

URG=1 当 URG 字 段 被 置 1, 表 示 本 数 据 报 的 数 据 部 分 包 含 紧 急 信 息 , 此 时 紧 急 指 针 有 效 。紧 急 数 据 一 定 位 于 当 前 数 据 包 数 据 部 分 的 最 前 面 ,紧 急 指 针 标 明 了 紧 急 数 据 的 尾 部 。如 control+c:这 个 命 令 要 求 操 作 系 统 立 即 停 止 当 前 进 程 。此 时 , 这 条 命 令 就 会 存 放 在 数 据 包 数 据 部 分 的 开 头 , 并 由 紧 急 指 针 标 识 命 令 的 位 置 , 并 URG 字 段 被 置 1。 
 
PSH=1 当 接 收 方 收 到 PSH=1 的 报 文 后 ,会 立 即 将 数 据 交 付 给 应 用 程 序 ,而 不 会 等 到 缓 冲 区 满 后 再 提 交 。一 些 交 互 式 应 用 需 要 这 样 的 功 能 ,降 低 命 令 的 响 应 时 间 。 
RST=1 当 该 值 为 1 时 , 表 示 当 前 TCP 连 接 出 现 严 重 问 题 , 必 须 要 释 放 重 连 。
 
ACK 设置为1表示前台的确认(ack)是有效的。
 
RST 用于重置一个已经混乱的连接。
 
SYN 用于建立连接的过程。
 
FIN 用来释放一个连接。
 
窗口大小 : 指定了从被确认的字节算起可以发送多少个字节。要深入理解这个域的含义,可以参看 TCP  拥塞控制和慢启动算法。
 
校验和 : 校验范围包括 TCP 头、数据报内容和概念性伪头部。概念性伪头部又包括源IP,目的IP,TCP协议号。

  
三次握手需要的信息:暂时需要的信息有:
 
ACK : TCP 协议规定,只有 ACK=1 时有效,也规定连接建立后所有发送的报文的 ACK 必须为 1。
 
SYN(SYNchronization) : 在连接建立时用来同步序号。当 SYN=1 而 ACK=0 时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使 SYN=1 和 ACK=1. 因此, SYN 置 1 就表示这是一个连接请求或连接接受报文。 
 
FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接

## **TCP 与 UDP 区别**

UDP 首部 8 个字节,TCP 首部最低 20 个字节。
对应的协议不同 TCP 对应的协议: 
(1) FTP:定义了文件传输协议,使用 21 端口。常说某某计算机开了 FTP 服务便是启动了文件传 输服务。下载文件,上传主页,都要用到 FTP 服务。
(2) Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这 种端口可以提供一种基于 DOS 模式下的通信服务。如以前的 BBS 是-纯字符界面的,支持 BBS 的服 务器将 23 端口打开,对外提供服务。 
(3) SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。 如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么 SMTP 端口设置这个栏,服务器开放的是 25 号端口。 
(4) POP3:它是和 SMTP 对应,POP3 用于接收邮件。通常情况下,POP3 协议所用的是 110 端 口。也是说,只要你有相应的使用 POP3 协议的程序(例如 Fo-xmail 或 Outlook),就可以不以 We b 方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是 163 邮箱就没有必要先进入网易网站, 再进入自己的邮-箱来收信)。 
(5)HTTP 协议:是从 Web 服务器传输超文本到本地浏览器的传送协议。 
 
UDP 对应的协议: 
(1) DNS:用于域名解析服务,将域名地址转换为 IP 地址。DNS 用的是 53 号端口。 
(2) SNMP:简单网络管理协议,使用 161 号端口,是用来管理网络设备的。由于网络设备很多, 无连接的服务就体现出其优势。 
(3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口 69 上使用 UDP 服务。

 

## **TCP 三次握手**

1.首先由 Client 发出请求连接即 SYN=1 ACK=0 (请看头字段的介绍), TCP 规定 SYN=1 时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x 
2.然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=y, ack=x+1, 
3.再然后 Client 再进行一次确认,但不用 SYN 了,这时即为 ACK=1, seq=x+1, ack=y+1.然后连接建立,为什么要进行三次握手呢(两次确认)。

 

> 为什么采用三次握手而不是采用两次握手?

## **TCP 四次挥手**



TIME_WAIT 阶 段 要 等 待 2 个 MSL 时 间 才 关 闭 , 因 为 网 络 原 因 可 能 要 重 发 。 CLOSE_WAIT 是要等待自己(通常是服务器)把自己传输东西发送完了。

 

 

 

 

## **tcp 粘包问题 nagle 算法**


 

 

 

## **tcp 如何保证可靠性传输**
1.数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢 弃报文段并且不给出响应,这时 TCP 发送数据端超时后会重发数据; 
2.对失序数据包重排序:既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到 达可能会失序,因此 TCP 报文段的到达也可能会失序。TCP 将对失序数据进行重新 排序,然后才交给应用层; 
3.丢弃重复数据:对于重复数据,能够丢弃重复数据; 
4.应答机制:当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确 认不是立即发送,通常将推迟几分之一秒; 
5.超时重发:当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个 报文段。如果不能及时收到一个确认,将重发这个报文段; 
6.流量控制:TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一 端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区 溢出,这就是流量控制。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
![](leanote://file/getImage?fileId=5fa6d8b4ef745f4ce600001c)

> https://coolshell.cn/articles/11564.html
> https://coolshell.cn/articles/11609.html
> http://blog.chinaunix.net/uid-26275986-id-4109679.html
> https://blog.csdn.net/jhh_move_on/article/details/45770087

## **TCP 流量控制 拥塞控制**
## **[TCP 流量控制](https://blog.csdn.net/sicofield/article/details/9708383)**
原因 : 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失
原理 : 是利用滑动窗口实现的,接收方告诉发送方自己额的接收窗口大小,然后发送方发送窗口不能超过接收方给出的接收窗口值

## **拥塞控制**
### **慢开始与拥塞避免**
**慢开始**
发送方维持一个叫做拥塞窗口 cwnd(congestion window)的状态变量。拥塞窗口的大小取决于 网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受 方的接收能力,发送窗口可能小于拥塞窗口。
 
慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。 
 
这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为 单位的。如下图:

解释一下这张图:就是发送方每收到一个确认就 cwnd+1,也就是说发送方发送 2 就收 到 2 个,所以就是 cwnd 就是 4,也就是翻倍成长的道理,每次都是翻倍,也就是指数增长。 
 
为了防止 cwnd 增长过大引起网络拥塞,还需设置一个慢开始门限 ssthresh 状态变量。ssthresh 的用法如下: 
当 `cwnd<ssthresh` 时,使用慢开始算法。 
当 `cwnd>ssthresh` 时,改用拥塞避免算法。 
当 `cwnd=ssthresh` 时,慢开始与拥塞避免算法任意。
**拥塞避免**
拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间 RTT 就把发送方的拥塞 窗口 cwnd 加 1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是 没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都 当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞 窗口设置为 1,执行慢开始算法。如下图:

### **快速重传快速恢复**
快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方 及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定, 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待 设置的重传计时器时间到期。如下图:

快重传配合使用的还有快恢复算法,有以下两个要点:
&nbsp;
①当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减半。但是 接下去并不执行慢开始算法。
&nbsp;
②考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小,然后 执行拥塞避免算法。如下图:

## **滑动窗口机制**


## **TCP 状态转移**

1. **CLOSED**:起始 点,在超时或者连接关闭时候进入此状态。 
2. **LISTEN**:svr 端在等待连接过来时候的状态,svr 端为此要调用 socket, bind,listen 函数,就能 进入此状态。此称为应用程序被动打开(等待客户端来连接)。
3. **SYN_SENT**:客户端发起连接,发送 SYN 给服务器端。如果服务器端不能连接,则直 接进入 CLOSED 状态。 
4. **SYN_RCVD**:跟 3 对应,服务器端接受客户端的 SYN 请求,服务器端由 LISTEN 状态 进入SYN_RCVD 状态。同时服务器端要回应一个 ACK,同时发送一个 SYN 给客户端;另外 一种情 况,客户端在发起 SYN 的同时接收到服务器端得 SYN 请求,客户端就会由 SYN_SENT 到SYN_RCVD 状态。 
5. **ESTABLISHED**:服务器端和客户端在完成 3 次握手进入状态,说明已经可以开始 传输数据了 以上是建立连接时服务器端和客户端产生的状态转移说明。相对来说比较简单明了, 如果你 对三次握手比较熟悉,建立连接时的状态转移还是很容易理解。 接下来服务器端和客户端就进行数据传输。。。。,当然,里面也大有学问,就此 打住,稍 后再表。 下面,我们来看看连接关闭时候的状态转移说明,关闭需要进行 4 次双方的交互, 还包括要处 理一些善后工作(TIME_WAIT 状态),注意,这里主动关闭的一方或被动关闭的一 方不是指 特指服务器端或者客户端,是相对于谁先发起关闭请求来说的:
6. **FIN_WAIT_1**:主动关闭的一方,由状态 5 进入此状态。具体的动作时发送 FIN 给对 方。
7. **FIN_WAIT_2**:主动关闭的一方,接收到对方的 FIN ACK,进入此状态。由此不能再 接收对方 的数据。但是能够向对方发送数据。
8. **CLOSE_WAIT**:接收到 FIN 以后,被动关闭的一方进入此状态。具体动作时接收到 FIN,同 时发送 ACK。 
9. **LAST_ACK**:被动关闭的一方,发起关闭请求,由状态 8 进入此状态。具体动作时 发送 FIN 给对方,同时在接收到 ACK 时进入 CLOSED 状态。 
10. **CLOSING**:两边同时发起关闭请求时,会由 FIN_WAIT_1 进入此状态。具体动作是, 接收到 FIN 请求,同时响应一个 ACK。 
11. TIME_WAIT:最纠结的状态来了。从状态图上可以看出,有 3 个状态可以转化成 它,我们 一一来分析: a.由 FIN_WAIT_2 进入此状态:在双方不同时发起 FIN 的情况下,主动关闭的一方在 完成自身发 起的关闭请求后,接收到被动关闭一方的 FIN 后进入的状态。 b.由 CLOSING 状态进入:双方同时发起关闭,都做了发起 FIN 的请求,同时接收到了 FIN 并做了 ACK 的情况下,由 CLOSING 状态进入。 c.由 FIN_WAIT_1 状态进入:同时接受到 FIN(对方发起),ACK(本身发起的 FIN 回应),与 b 的区别在于本身发起的 FIN 回应的 ACK 先于对方的 FIN 请求到达,而 b 是 FIN 先
到达。这种情 况概率最小。
## **TIME_WAIT 和 CLOSE_WAIT**

 

 

 

 

 

 

 

关闭的 4 次连接最难理解的状态是 TIME_WAIT,存在 TIME_WAIT 的 2 个理由: 
1.可靠地实现 TCP 全双工连接的终止。
2.允许老的重复分节在网络中消逝。
https://blog.csdn.net/wu936754331/article/details/49104497 
https://blog.csdn.net/u013616945/article/details/77510925 
### **1.为什么 time_wait 需要 2*MSL 等待时间?**
MSL 就是 maximum segment lifetime(最大分节生命期),这是一个 IP 数据包能 在互联网上生存的最长时间,超过这个时间将在网络中消失。 现在我们考虑终止连接时的被动方发送了一个 FIN,然后主动方回复了一个 ACK,然而这个 ACK 可能会丢失,这会造成被动方重发 FIN,这个 FIN 可能会在 互联网上存活 MSL。 如果没有 TIME_WAIT 的话,假设连接 1 已经断开,然而其被动方最后重发的那个 FIN(或者 FIN 之前发送的任何 TCP 分段)还在网络上,然而连接 2 重用了连接 1 的所有的 5 元素(源 IP,目的 IP,TCP,源端口,目的端口),刚刚将建立好连接, 连接 1 迟到的 FIN 到达了,这个 FIN 将以比较低但是确实可能的概率终止掉连接 
### **2. 大量的 time_wait 如何解决**
修改 /etc/sysctrl.conf 文件

 

 

### **3.为什么 TIME_WAIT 状态还需要等 2*MSL(Max SegmentLifetime,最大分段生存期)秒之后才 能返回到 CLOSED 状态呢?**
因为虽然双方都同意关闭连接了,而且握手的 4 个报文也都发送完毕,按理可以直接回到 CLOSED 状态(就好比从 SYN_SENT 状态到 ESTABLISH 状态那样),但是我们必须假想网络是不可靠的, 你无法保证你最后发送的 ACK 报文一定会被对方收到,就是说对方处于 LAST_ACK 状态下的 SOC KET 可能会因为超时未收到 ACK 报文,而重发 FIN 报文,所以这个 TIME_WAIT 状态的作用就是用 来重发可能丢失的 ACK 报文。

## **当一个 tcp 监听了 80 端口后,Udp 还能否监听 80 端口**
答:由于 TCP/IP 传输层的两个协议 TCP 和 UDP 是完全独立的两个软件模块,因此各 自的端口号也相互独立,如 TCP 有一个 255 号端口,UDP 也可以有一个 255 号端口,二 者并不冲突。 。

> 9.tcp 的滑动端口机制 如何保证不重复发送的 
10.描述 TCP 滑动窗口机制,如何实现流控 
11.防止 xxs 攻击和 sql 攻击等等 
12.[TCP/IP 有几层,每层有何含义](https://blog.csdn.net/xieyutian1990/article/details/23789871)

13. tcp 包可以被篡改吗?

 

----------
# **计算机网络分层模型**
## **osi 七层**
**7.应用层**
对应用程序的通信服务
telnet,HTTP,FTP,NFS,SMTP等。
**6.表示层**
定义数据格式及加密。
加密,ASCII等。
**5.会话层**
定义如何开始、控制和结束一个会话(包括对多个双向消息的控制和管理)
RPC,SQL
**4.传输层**
决定选择差错恢复协议还是无差错恢复协议;在同一主机上对不同应用的数据流的输入
进行复用;对收到的顺序不对的数据包的重新排序。
TCP,UDP,SPX。
**3.网络层**
定义了端到端的包传输,还定义了逻辑地址,恩。。路由实现的方式和学习的方式。
IP,ICMP,ARP,RARP,IPX等。
2.数据链路层
研究单个链路上如何传输数据。与各种介质有关ATM(异步传输模式),FDDI(光纤分布式数据接口)。
1.物理层
定义了有关传输介质的特性标准
Rj45,802.3等。

## **APR**
(1)首先,每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。 
(2)当源主机要发送数据时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MA C 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包, 该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址。 
(3)当本网络的所有主机收到该 ARP 数据包时,首先检查数据包中的 IP 地址是否是自己 的 IP 地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的 IP 和 M AC 地址写入到 ARP 列表中,如果已经存在,则覆盖,然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。 
(4)源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此 信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。 广播发送 ARP 请求,单播发送 ARP 响应。 
## **ICMP 协议**
ICMP 是 InternetControl Message Protocol,因特网控制报文协议。它是 TCP/IP 协议族的一 个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、 路由器是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递 起着重要的作用。ICMP 报文有两种:差错报告报文和询问报文。 
## **DNCP 协议**
动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。通常被应 用在大型的局域网络环境中,主要作用是集中的管理、分配 IP 地址,使网络环境中的主机动态的获 得 IP 地址、Gateway 地址、DNS 服务器地址等信息,并能够提升地址的使用率。 
## **RARP 协议**
逆地址解析协议,作用是完成硬件地址到 IP 地址的映射,主要用于无盘工作站,因为给无盘工 作站配置的 IP 地址不能保存。
## **[路由选择协议OSPF RIP ](https://blog.csdn.net/xuzhiwangray/article/details/5050)**

 

RIP:(距离向量路由)

RIP:1.A 收到附近节点 C 的路由表信息,然后将附近节点 C 作为下一跳,那么 A 的距离就得在 C 上加 1
2. 然后合并新的路由节点信息,合并过程: 
(1 )无新信息,不改变 
(2 )新的项目,直接添加 
(3 )相同的下一跳,更新 
(4 )不同的下一跳,距离更短则更新距离和下一跳地址,否则不变
OSPF:(链路状态路由)

## **SNMP** 
简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protoco l)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设 备是否有任何引起管理上关注的情况。 
## **SMTP** 
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规 则,由它来控制信件的中转方式。

 

 

----------
# **IP**
## **报文**

## **IP 地址类别**

## **特殊的地址**

## **私有地址**

 

----------


# **网络攻击**
## **1.SYN Flood 攻击**
一些恶意的人就为此制造了 SYN Flood 攻击——给服务器发了 一个 SYN 后,就下线了,于是服务器需要默认等 63s 才会断开连接,这样,攻击者就可以 把服务器的 syn 连接的队列耗尽,让正常的连接请求不能处理。
于是,Linux 下给了一个叫 tcp_syncookies 的参数来应对这个事——当 SYN 队列满了后,TCP 会通过源地址端口、目 标地址端口和时间戳打造出一个特别的 Sequence Number 发回去(又叫 cookie),如果是 攻击者则不会有响应,如果是正常连接,则会把这个 SYN Cookie 发回来,然后服务端可 以通过 cookie 建连接(即使你不在 SYN 队列中)。请注意,请先千万别用 `tcp_syncookies` 来处理正常的大负载的连接的情况。因为,synccookies 是妥协版的 TCP 协议,并不严谨。
对于正常的请求,你应该调整三个 TCP 参数可供你选择,第一个是:`tcp_synack_retries` 可 以用他来减少重试次数;第二个是:`tcp_max_syn_backlog`,可以增大 SYN 连接数;第三 个是:`tcp_abort_on_overflow` 处理不过来干脆就直接拒绝连接了。
## **2. DDOS 攻击**
DDoS 攻击是 ***Distributed Denial of Service*** 中文意思为“分布式拒绝服务”,就是利用大量合法的分布式服务器对目标发送请求,从而导致正常合法用户无法获得服务。
预防:
1.高防服务器 主要是指能独立硬防御 50Gbps 以上的服务器,能够帮助网站拒 绝服务攻击,定期扫描网络主节点等 
2.DDoS 清洗会对用户请求数据进行实时监控,及时 发现 DOS 攻击等异常流量,在不影响正常业务开展的情况下清洗掉这些异常流量。
3.CDN 加速 在现实中,CDN 服务将网站访问流量分配到了各个节点中,这样一方面隐藏网站的 真实 IP,另一方面即使遭遇 DDoS 攻击,也可以将流量分散到各个节点中,防止源站崩溃。
## **3.DNS 欺骗**
DNS 欺骗就是攻击者冒充域名服务器。把查询的IP地址设为攻击者的IP地址。
**欺骗形式:**
Ⅰ.hosts文件篡改
Ⅱ.本机DNS劫持
预防:
1.使用入侵检测系统 
2.使用 DNSSEC
## **4. 重放攻击**
重放攻击又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。 
预防:
1.加随机数 
2.加时间戳
## **5.SQL 注入**
SQL 注入就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的 查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。
预防:
1.加密处理 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然 后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户 输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入 SQL 命令。
2. 确保数据库安全 只给访问数据库的 web 应用功能所需的最低的权限,撤销不必要 的公共许可 
3. 输入验证 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据 检查应当在客户端和服务器端都执行之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值