【网络】http详解

169 阅读17分钟

网络基础

1.1.1 TCP/IP协议族

http是tcp/ip协议族的子集,超文本传输协议

WebSocket是HTML5中的协议。基于TCP协议,支持页面使用Web Socket协议与远程主机进行全双工的通信

FTP是文件传输协议,FTP和http协议不同的是,ftp支持断点续传,且使用tcp

  • TCP协议的概述

    • 是面向连接的运输层协议
    • 建立连接,通信,释放连接,每一条连接点对点
    • TCP提供可靠交付
    • 提供全双工通信:允许通信双方在任何时都能发送数据,连接的两端都设置有发送缓存,接受缓存
    • 面向字节流:流的意思是指,流入进程或从进程流出的字节流,看成一连串无结构的字节流
  • TCP全双工通信是什么意思呢

    • 就是说,TCP在发送的时候,将数据传送给应用程序的发送缓存,就可以不管了,做自己的事情了,而TCP在接受缓存的时候,把收到的数据放入缓存,上层的应用的程序在合适的时候直接从缓存中读取数据
  • TCP的链接

    • TCP链接的端点叫做socket = (IP:端口号)
    • TCP连接::={ socket1,socke2}={(IP1:port1),(IP2:port2)}
    • 同一个IP地址有不同的TCP链接,同一个端口号出现在不同的TCP链接中
  • 可靠传输的工作原理

    • TCP发送的报文段是交给IP层传输的,IP层是尽最大努力交付,所以,TCP下面的网络即IP是进行的不可靠传输
    • 理想的传输条件有两个特点:
      • 传输信道不产生差错
      • 不管发送方以多块的速度发送数据,接收方总是来得及处理收到的数据

一般解决方式:

出现差错时让发送方重传出现差错的数据

同时接收方来不及处理收到的数据时,告诉发送方适当降低发送数据的速度。

涉及到一个协议

  • 停止等待协议

    • 停止等待协议(stop-and-wait)是最简单但也是最基础的数据链路层协议。
    • 将传送的数据单元叫做分组
    • 停止等待就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

    • 出现差错 超时重传,A只要超过一段时间仍然没有收到确认,就认为刚才的发送的分组丢失了

因而重传前面发送过的分组

    • 注意三点:

A在发送完一个分组后,必须暂时保留已发送的分组的副本,只有收到确认才删除副本

分组和确认分组都必须进行编号,才能明确是哪一个发送出去的分组收到了确认

超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些,重传时间设置太短,产生不必要的重传

    • 确认丢失和确认迟到 —— 自动重传请求(ARQ)

全双工通信的双方既是发送方,也是接收方。

B所发送的对M1的确认丢失了。A在设定好的超时重传中没有收到确认。无法知道是自己发送分组错误,丢失或者是B发送的确认回复丢失。

因此A:再次重传,此时B的动作:收到了重传的分组M1,丢弃这个重复的分组M1,不向上层交付。向A发送确认。

此时,假如B是迟到的确认,A会收到重复的确认,对重复的确认处理就是收到丢弃

  • 连续ARQ协议

    • 为了克服停止并等待ARQ协议长时间等待ACK的缺点。这个协议会连续发送一组数据包,然后再等待这些数据包的ACK

    • 滑动窗口协议

发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大,而导致溢出,同时控制流量也可以避免网络拥塞。下面图中的4,5,6号数据帧已经被发送出去,但是未收到关联的ACK,7,8,9帧则是等待发送。可以看出发送端的窗口大小为6,这是由接受端告知的(事实上必须考虑拥塞窗口cwnd,这里暂且考虑cwnd>rwnd)。此时如果发送端收到4号ACK,则窗口的左边缘向右收缩,窗口的右边缘则向右扩展,此时窗口就向前“滑动了”,即数据帧10也可以被发送。

  • TCP的报文段的首部格式

    • TCP虽然是面向字节流的,但TCP传送的数据单元确是报文段。
    • 紧急URG = 1时有效,拥有紧急数据,应尽快传送,
    • 确认ACK =1 时确认号字段有效,当ACK = 0,确认号无效,TCP规定,在连接建立后所有传送的报文段都必须把ACK置1
    • PSH = 1,立即创建一个报文段都发送出去
    • RST 当RST = 1,TCP连接中出现严重差错,必须释放连接,然后再重新建立运输链接。RST=1还用来拒绝一个非法的报文段或拒绝打开一个链接。RST可称为重置位。
    • 同步SYN=1 ACK =0,表示这是一个连接请求报文段,对方若同意建立连接,应在响应的报文段中使SYN = 1和ACK = 1
    • FIN用来释放一个连接,数据发送完毕,并要求释放运输连接
    • 窗口 2字节,[0~2的16次方-1]
  • TCP可靠运输的实现

    • 应用数据被分割成TCP认为最适合的长度进行发送
    • 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认将重发这个报文段。
    • TCP将保持它首部和数据的检验和。如果收到段的检验和有差错,TCP将保持它首部和数据的检验和。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
    • 报文段的到达也可能会失序,如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确顺序交给应用层。
    • TCP提供流量控制。TCP链接的每一方都有固定大小的缓冲区。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。
    • TCP以报文段为单位进行传输的传输方式,超时重传的策略等,都为传输提供了可靠性。

以字节为单位的滑动窗口

  • TCP的流量控制

    • 流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
    • 发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意,TCP的窗口单位是字节,不是报文段。

  • TCP的拥塞控制

    • 拥塞控制的概念:∑对资源的需求>可用资源
    • 拥塞引起的重传并不会环节网络的拥塞,反而会加剧网络的拥塞。
    • 拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载
    • 流量控制是指对点对点通信录的控制,是个端对端的问题。而拥塞控制是个全局的问题,涉及到所有的主机,路由器等。
    • 几种拥塞控制的方法
      • 慢开始:发送方维持一个叫做拥塞窗口的状态变量。发送窗口 = 拥塞窗口

​ 当主机开始时,如果立即把大量数据字节注入网络,那么就有可能发生网络拥塞。所以采用由小到大逐渐增大拥塞窗口数值。

      • 拥塞避免:拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT是把发送方的拥塞窗口cwnd加1,而不是加倍。(加法增大)

​ 乘法减小:指不论在慢开始阶段还是拥塞避免阶段,只要出现超时,就把慢开始门限ssthresh减半,设置为拥塞窗口的一半

      • 快重传
      • 快恢复

TCP对应的协议

(1) FTP:定义了文件传输协议,使用21端口。

(2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。

(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。

(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。

(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。

UDP对应的协议

(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。

(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。

(3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

1.1.2 三次握手和四次挥手

建立连接阶段

syn ack字段去控制

发送报文

断开连接

四次挥手

TCP与UDP的区别

答:TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。

TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。

TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般。

HTTP协议

2.1 概念

http是不保存状态的协议

HTTP 协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。

2.1.1 http与http1.1的区别

http传输的数据都是未加密的,也就是明文的,网景公司设置了SSL协议来对http协议传输的数据进行加密处理,简单来说https协议是由http和ssl协议构建的可进行加密传输和身份认证的网络协议,比http协议的安全性更高。

Https协议需要ca证书,费用较高。

http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

使用不同的链接方式,端口也不同,一般而言,http协议的端口为80,https的端口为443

http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

2.1.2 http与https的区别

2.2 请求 URI 定位资源

HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功 能,在互联网上任意位置的资源都能访问到。 当客户端请求访问资源而发送请求时,URI 需要将作为请求报文中的

请求 URI 包含在内。

2.3 HTTP请求

2.3.1 请求方式的几种区别

HTTP请求方式区别
get拿数据,做缓存,只支持ASCII码,不加密暴露URL,限制传参的长度
描述GET 方法用来请求访问已被 URI 识别的资源,get请求参数的大小存在限制,而post请求的参数大小是无限制的
post得到数据,不缓存,加密(约定协议,字符集,请求名)传输实体主体
head获得报文首部
put修改,传输文件
TRACE追踪路径
options询问支持的方法
delete删除
connect要求用隧道协议连接代理

2.3.2 get请求传参长度的误区

实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度。为了明确这个概念,我们必须再次强调下面几点:

  • HTTP 协议 未规定 GET 和POST的长度限制
  • GET的最大长度显示是因为 浏览器和 web服务器限制了 URI的长度
  • 不同的浏览器和WEB服务器,限制的最大长度不一样
  • 要支持IE,则最大长度为2083byte,若只支持Chrome,则最大长度 8182byte

2.3.3 get和post请求在缓存方面的区别

  • get请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存。
  • post不同,post做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用缓存。因此get请求适合于请求缓存。

2.4 HTTP响应

2.4.1 http状态码

2.4 持久连接

HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP 连接。 以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可随着 HTTP 的普及,文档中包含大量图片的

情况多了起来。 比如,使用浏览器浏览一个包含多张图片的 HTML页面时,在发送请求访问 HTML页面资源的同时,也会请求该 HTML页面里包含的其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。

四次握手保持持久连接

持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使 HTTP请求和响应能够更早地结束,这样 Web 页面的显示速度也就相应提高了。

所有的连接默认都是持久连接,但在 HTTP/1.0 内并

未标准化。虽然有一部分服务器通过非标准的手段实现了持久连接,

但服务器端不一定能够支持持久连接。毫无疑问,除了服务器端,客

户端也需要支持持久连接。

2.5 编码提升传输速率

HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的 CPU 等资源。

2.5.1 报文主体和实体主体的差异

常用的内容编码有以下几种。

gzipGNU zip

compressUNIX 系统的标准压缩)

deflatezlib

identity(不进行编码)

3.5 获取部分内容的范围请求

要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求(Range Request)。

对一份 10 000 字节大小的资源,如果使用范围请求,可以只请求5001~10 000 字节内的资源。

执行范围请求时,会用到首部字段 Range 来指定资源的 byte 范围

byte 范围的指定形式如下。 5001~10 000 字节 Range: bytes=5001-10000 从 5001 字节之后全部的 Range: bytes=5001- 从一开始到 3000 字节和 5000~7000 字节的多重范围 Range: bytes=-3000, 5000-7000

字符集和内容编码的区别

content-type有多少种类型

登录验证选用sessioncookie还是token模式

http是无状态的

前后端不存在跨域,使用cookie session

前后端存在跨域,使用token方式

报文信息

请求报文
响应报文

重定向和转发的区别

重定向是客户端行为,转发是服务器行为

图片防盗链接,获取请求报文数据,getallheaders()

响应报文中的HTTP状态码

1xx
2xx
3xx
4xx
5xx

get与post的区别

get 可以收藏为书签

post 不可收藏为书签

3.1 HTTP首部

3.1.1 http报文首部

Accept

Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用 type/subtype这种形式,一次指定多种媒体类型。

文本文件

text/html, text/plain, text/css ...

application/xhtml+xml, application/xml ...

图片文件

image/jpeg, image/gif, image/png ...

视频文件

video/mpeg, video/quicktime ...

应用程序使用的二进制文件

application/octet-stream, application/zip ...

Accept-Charset

Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字 段 Accept 相同的是可用权重 q 值来表示相对优先级。 该首部字段应用于内容协商机制的服务器驱动协商

iso-8859-5, unicode-1-1;q=0.8

Accept-Encoding

gzip, deflate

gzip

由文件压缩程序 gzip(GNU zip)生成的编码格式

(RFC1952),采用 Lempel-Ziv 算法(LZ77)及 32 位循环冗余

校验(Cyclic Redundancy Check,通称 CRC)。

compress

由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel-

Ziv-Welch 算法(LZW)。

deflate

组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法

(RFC1951)生成的编码格式。

identity

不执行压缩或不会变化的默认编码格式

采用权重 q 值来表示相对优先级,这点与首部字段 Accept 相同。另

外,也可使用星号(*)作为通配符,指定任意的编码格式。

Accept-Language

zh-cn,zh;q=0.7,en-us,en;q=0.3

首部字段 Accept-Language 用来告知服务器用户代理能够处理的自然 语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。

Authorization

首部字段 Authorization 是用来告知服务器,用户代理的认证信息(证

书值)。通常,想要通过服务器认证的用户代理会在接收到返回的

401 状态码响应后,把首部字段 Authorization 加入请求中。共用缓存

在接收到含有 Authorization 首部字段的请求时的操作处理会略有差

异。

User-Agent

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0)

3.1.2 http首部字段

3.1.3 http/1.1 通用首部字段

3.1.4 请求首部字段

3.1.5 响应首部字段

3.1.6 实体首部字段

5.1 https协议

https: 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

SSL(secure sockets layer)是在传输层对网络连接进行加密

5.1.1 请求报文以及响应