网络知识 - 网络传输协议

Posted myrocknroll

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络知识 - 网络传输协议相关的知识,希望对你有一定的参考价值。

网络传输协议(Network Transfer Protocol)

在计算机网络通信的世界里,协议是指两台计算机之间为了实现相互通信由万维网所发布的一个双方认同并约定的规范, 

技术分享图片技术分享图片

 

技术分享图片技术分享图片

 

两种网络地址

mac地址

计算机硬件厂商在出厂网卡时为网卡设计的具有能标识这块网卡的唯一性的地址,具有唯一性。当N台计算机在局域网中进行通信时,它们需要遵守链路层协议,这个协议规定计算机发送数据给另一台计算机时需要提供自己的地址,这个地址就是mac地址,用来表示计算机自身。

IP地址

互联网络是高于局域网络的更高级别的抽象,它统领处于不同链路层协议的各个局域网。为此,就需要为每一个能连接到互联网的计算机设计一个具有能标识这台计算机的唯一性的地址,这个地址就是IP地址,用来表示计算机自身。

mac与IP的异同

都能用来表示网络地址,但一个是属于局域网的,另一个属于互联网。可以称mac是物理地址,IP是虚拟地址,但它们都具备唯一性。在命令行输入ipconfig/all可以查看本机的mac地址和网络IP地址,如果是wifi连接,还可以看到路由器的mac地址和网络IP地址。

 

三种网络

局域网

一根网线,点对点就能搭建一个局域网,通常使用交换机搭建局域网,A将封装了B的mac地址的数据传输至交换机,由交换机取出封装在数据中的接收方的mac地址,然后从注册在mac表中的地址列表中找出匹配的目标地址,如果匹配成功则转发数据。

广域网

比局域网更大的由多个局域网组成的网络。A传输数据到交换机x,由交换机x传输至另一个局域网中的交换机y,由y将数据转发至处于y网下的接收方B。

互联网

将所有局域网、广域网连接成一个整体。

 

网络分层协议(实现网络、实现互通的技术规范)

可以把每台独立的计算机想象成两个来自不同国家的人(A和B),他们因地域文化语言的障碍而无法畅快的沟通,所以计算机之间要相互通信是一个复杂的技术问题,为了能使他们进行有效的沟通交流,就出现了协议。计算机之间的通信是基于约定,也即,当A和B约定了SOS==求救,那么在这个约定之下,当A发出SOS的数据到B处时,B就知道这是一个求救的请求。如果没有这个约定,那么A发出SOS信号到B处,B就不知道如何做出处理。所以,简言之,协议就是双方约定的规范,目的是能理解对方的意图并因此做出回应。在计算机网络通信中,协议被分为5个层,A、B双方都必须遵守每个层的协议才能实现通信。比如发起一个http请求就是发起一个基于http协议规范的请求。而这些协议说穿了就是技术守则、技术手段,双方只要利用这些约定的技术标准、技术规格就可以搭建起一个网络,就能够使计算机之间的相互通信成为可能。这些协议层包括了实现通信的物理技术规范、处理数据的格式规范等等。网络协议保证了可读数据在整个转换和传输过程中的完整性。

技术分享图片技术分享图片

物理层(physical layer)

处于物理层的对象:光纤、电缆、电磁波

物理层包含的技术规范:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45

物理层协议:规范承载数据的载体。计算机中的数据都是0和1的数字序列,而0和1的序列总是需要利用某种现实世界的物质作为载体,需要某种媒介予以表示。规范这一实现的就是物理层协议。载体就是光纤、电缆,媒介是光电( 高电平(1)和低电平(0))。

当一台计算机使用了光纤作为传输媒介,它就具备了与另一台计算机进行通信的基础。

链路层(link layer)

处于链路层的对象:统管基于相同链路层协议的计算机的网络,我们熟知的以太网技术和Wifi技术就是不同的链路层协议。如:有线局域网络(以太网)、无线局域网络(Wifi)

链路层包含的协议:[广域网:HDLC、PPP、SLIP]、[局域网:MAC子层协议 | LLC子层协议]

链路层协议:规范双方传输数据的格式,A、B双方按照链路层的协议将发送的数据封装为数据帧(Frame),帧必须含有以下三种格式的数据:

1.发送方的mac地址(Source)

2.接收方的mac地址(Destination)

3.数据(Payload)

3.测试数据错误的校验序列(Check)

当N台计算机都遵守了物理层和链路层的协议后,它们就可以搭建起一个局域网络,实现互通。

网络层(network layer)

处于网络层的对象:统管基于不同链路层协议的计算机的中间人,如:路由器

网络层包含的协议:IP协议、ICMP协议、RAP协议、RARP协议 

网络层协议:规范基于不同的链路层协议的N台计算机进行通信的传输数据的格式,因为基于不同的链路层协议的两台计算机不能进行有效的通信,无法沟通,A无法适应B,因为他们的链路层的规范不一样,而网络层协议则充当了翻译的角色,网络层对象必须具备以下能力:

1.能接收和发送来自基于不同链路层协议的计算机的数据

2.能有效识别A发给B的数据,并把帧封装的数据取出来重新封装为包(Packet),再转发给B。既然如此,那么网络层对象就可能需要遵守多个链路层协议规范才能充当统管和翻译的角色。包必须含有以下几种格式的数据:

1.发送方的IP地址(Source)

2.网络层对象的IP地址(Destination)

3.接收方的IP地址(Destination)

4.数据(Payload)

5.测试数据错误的校验序列(Check)

当N台计算机都遵守了物理层、链路层和网络层的协议后,它们就可以搭建起一个互联网络,由网络层对象负责分发IP给它们,实现互通。

传输层(transport layer)

传输层包含的协议:TCP协议 | UDP协议 | TLS协议 | SSL协议 

传输层协议:规范本地计算机的各个需要网络通信的应用程序进程的端口号,当A计算机的某个进程把数据发送至B计算机,只有B计算机可以接收到数据,但是A的某个进程实际上是需要将数据发送给B计算机的某个进程,这是一个需要解决的问题,针对这个问题,传输层规范了本地端口号,如果A计算机的x进程想要将数据发送至B计算机的y进程,那么x进程除了需要提供B计算机的mac地址或IP地址外,它还需要提供y进程的端口号才可以。数据送达B计算机后,由B的某个操作系统进程根据端口号将数据转发给y进程。处于此层的数据称为段(Segment)。

当N台计算机都遵守了物理层、链路层、网络层、传输层的协议后,它们各自的进程之间就能实现传输数据。

应用层(application layer)

处于应用层的对象:应用程序

应用层包含的协议:HTTP协议 | FTP协议 | IMAP协议 | DNS协议 | NNTP协议

应用层协议:规范处于任何网络中的计算机的各个需要网络通信的应用程序进程的专用数据规范,比如Ftp(文件传输协议)、Http(超文本传输协议)、Imap(电邮协议)、Dns协议(域名系统服务协议)、Nntp(新闻传输协议)。

数据传输时的封装过程 

发送方发送的数据都是以应用层为起点,一步一步经过每一个层对数据进行封装处理后发送到接收方,接收方接收到数据后,需要一步一步进行拆封,直到露出最基本的原始数据为止。发送数据时,是从应用层开始向物理层传递数据,每一层都会对数据附加一个头部信息(报文头部),对数据加以封装,头部信息包含了发送方和接收方的地址和一些控制传输行为的指示性数据,封装完成后会继续往下一层发送。见下图,其中的表示层和会话层没有协议。

技术分享图片技术分享图片

1.应用层针对具体的应用层协议对数据进行格式化处理,比如http协议会将数据格式化为带有请求行、消息报头、请求正文的规范数据体。

2.传输层为数据附加头部信息,这包括双方进程端口号

3.网络层为数据附加头部信息,这包括双方ip地址

4.链路层为数据附加头部信息,这包括双方mac地址

5.物理层以二进制格式传输数据 

ARP协议获取接收方的mac地址

ARP协议处于网络层,它的作用是将接收方的IP地址转化成物理地址,从上图中可以看到,发送方将数据层层封装后根据IP地址发往接收方,数据到了接收方后会首先进入链路层,链路层将数据拆包后发现发送方没有填写目标mac地址,因为发送方只知道目标(接收方)的网络IP,所以mac被看成是null,这与接收方的mac地址不匹配,这样,数据包会被丢掉。ARP协议则规范了发送方发起传输请求的时候得实现ARP规范,这样,请求发起时会预先向网络发起广播咨询,咨询会询问处于同一个网络中的所有主机:我要发送数据的接收方的IP所对应的mac地址是什么,所有主机都会侦听到这个请求,而具有与IP对应的mac地址的主机则会做出应答,它会将自身的mac地址发送给对方。这样,当原来作为发送方的对象得到目标mac地址后就会再发起一个请求,将目标mac地址封装在请求中。这样,目标方就能够匹配这个物理地址从而接收数据包。每一个支持ARP协议的计算机都会创建一个ARP缓存表,用以存储已经询问过的IP所对应的mac地址,当下一次再对一个之前已经询问过的IP发起传输请求时,系统会可以自动从缓存表中找到IP所对应的mac地址了。在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。通过持续不断的伪造ARP应答可以使网络堵塞,因为A广播请求询问某个目标IP的mac地址,能匹配这个mac地址的主机就会进行回应,但黑客会主动应答询问者,将伪造的mac地址发送给询问者。这样,系统将错误的mac地址更新到缓存表,如果黑客大量的伪造ARP应答就会使大量计算机发起的请求得不到回应从而产生大量的网路阻塞,而且黑客如果将自己主机的mac地址响应给询问者,那么询问者就会再毫不知情的情况下向黑客传输私密数据,成为安全隐患。

TCP协议的三次握手和四次分手

三次握手

TCP连接处于传输层,当需要传输数据到目标地址端口号时,会预先发送一个主动要求建立关系的SYN数据包,SYN表示要求与接收方同步建立连接,接着接收方会发送一个SYN+ASK数据包做为对请求的应答,再接下来源发送方会发送一个ASK数据包作为应答,这样经过三次的握手,关系正式建立,可以传输数据了。

技术分享图片

为什么需要三次确认?似乎,当我发给你数据后,只要你能回复我,我能接到你的回复,则已经证明信道是通畅的,为什么还要再握手一次才能正式传输数据?这是因为我能接收到你的数据(第二次握手),你也能接收到我的数据(第一次握手),这都是站在我这方(单方面)来考虑信道是否通畅,因为我只能确认你能成功发送数据给我(第二次握手)同时我也能发送数据给你(第一次握手),but,你并不能确定你发送的数据成功到了我这里,so,两次握手只能让我确认我们可以正确传输数据,而你最多只能确认我可以发数据给你,但不能确认你的数据能不能成功发送到我这里。

四次分手

技术分享图片

为什么需要四次才能彻底分手?因为一次只能应答一个问题,所以(第1次)当A方发送数据包通知B方,我已经没有数据向你发送了,(第二次)B方只能发起一个应答数据包表示Ok,我已经知道了,(第3次)然后B再次发起一个数据包表示我也没有数据向你发送了,(第4次)A回应B,Ok,我们结束通信。

TCP协议的报头

TCP协议的报头数据是为了描述建立的TCP连接的状态。TCP封装数据后的报文头如图所示:

技术分享图片技术分享图片

下面对上图中比较重要的两个项做出解释:

1.序列号(Seq)

发送方发送的数据包的序号,比如向接收方发出数据包时,数据包中的头部总是含有Seq的值,这个值表示目前向接收方发出的数据包的个数,几乎都是从x开始,这个起始值可能是随机变量值,通常从0开始,但下一次发起则会++,也即第一次发起数据包Seq=0,第二次发起数据包则Seq=1,以此类推。为了方便记忆,可以这样描述:这是我要向你发送的第x个包,下一次再发送则x++。

2.确认号(Ack)

可以这样描述:我要求你发送给我第x++个包。

2.控制位(ControBits Flag)

ControBits Flag是位标志枚举,用来表示发出的数据包的类型,可能的值如下:

URGURG数据包,保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据,当应用了此项时,紧急指针才有效。
PSHPSH数据包,表示数据包到达接收端以后,应立即传送给应用程序,而不要进入缓冲区队列。
RSTRST数据包,表示重置连接,应对产生错误的、非法的数据连接。
FINFIN数据包,表示数据流已达到末尾,传输完成,连接将被断开。
ACKACK数据包,表示应答信号。注意这个ACK和确认号的Ack不是一个概念,只是名称相同。
SYNSYN数据包,表示要求建立连接的信号。

Http协议

Http协议是处于应用层面的、规范数据传输格式的协议。由万维网协会(World Wide Web Consortium [ www ] )和 Internet 工作小组( Internet Engineering Task Force [IETF] )联合发布。

协议规范

1.http协议的默认端口:80、https协议的默认端口:443
2.客户端发起请求,请求中包含自身的网络IP和进程的端口号,服务端响应请求
3.每个请求会先进入队列,服务端一次处理一个请求,处理完毕就会释放建立的连接(客户端IP和端口与服务端IP保持通信),清空服务端资源
4.无状态,所谓无状态,是指基于Http协议的数据传输是一次性的,在客户端发起请求到服务端接收到请求的这个期间的一切数据仅在此时此刻有效,
  离开这个期间,一切回归平静,不起一丝波澜。在这个期间,客户端和服务端是朋友关系,建立起一个连接。
  服务端处理完请求后,有关这个请求的Http数据就会消失,也即,服务端是从基于Http协议传输的数据来和你建立关系,
  数据传输过来,服务端做出处理,然后你的数据会被忘掉。当你下一次再和服务端建立连接时,即使你带着自身的网络ip和端口号,
  他也会以为你是一个全新的朋友。http的设计之初就是为了使其健忘,减少服务端的内存占用,免得服务端不堪重负,存储一大堆旧数据。
  http协议的健忘症属于先天缺陷,他只保持一次性的传输,之后什么都不记得,传输完成,马上被清除掉,服务端继续接待下一个客户端的请求。
  别跟服务端提因为以前你们认识所以这次请求可以省略一些必要的Http数据,这是行不通的,别跟服务端说我之前给过门票(请求),
  我不过是出去上个厕所你TM的就不认识我了。再打个比方,一个登陆页面提供了用户名和密码,你填写完后提交到服务端,
  这些http数据到达服务端被处理之后就会被丢掉,当你下一次继续请求某个需要权限(已登录用户)的资源但你又没有继续提供前一次提供的用户名和密码时,
  服务端就会给阻止你,也即你必须提供之前那个请求所提供的完全相同的登录数据才可以。为了解决http的无状态性,
  浏览器都支持cookie,cookie可以存储已登录用户的信息,所以下一次当你再发起请求时却并不提供你的登录名和密码,
  服务端也不会因为不知道你是谁从而阻止你对某个需要权限的资源的请求,因为服务端由开发人员编写的程序会从cookie中读取你的身份信息,
  这样,http看起来似乎就不再那么健忘了,实际上它还是健忘的,总之,它的有效性只在从客户端传输到服务端为止,记住这一点即可!
5.保持连接,Http1.0版本中会针对每一个请求建立一个TCP连接。也即,一个网页的http请求如果包含其它http请求,
   那么一次只处理一个,比如网页可能包含了对css,js等的请求,这些请求只能等待第一个请求被处理完成,
   连接已经释放后,才会被发送到服务端,这样会再次建立新的tcp连接。在http.1版本的协议中,
   针对来自同一ip的多个http请求只会建立一个连接,也即客户端可以连续发送多个http请求到服务端进入队列,
   服务端依次处理完之后,释放连接。好处在于节省了创建连接的时间。从HTTP/1.1起默认都开启了Keep-Alive( 保持连接 ),
   但即使一直保持着双方的通信连接也并不改变http的无状态。连接的保持只是为了节省建立连接的时间而已,
   免得下次请求时又要重新创建连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
6.一个http链接就是一个http请求,通常一个网页程序包含N个http请求,比如页面中会请求js和css、图片资源等等。 

Http报文

客户端发起请求的数据或服务端做出回应的数据都是经过http.sys封装成http报文后向各个OSI层传递,层层封装,最后通过光纤传输至目标计算机,目标计算机再层层拆包,最终将数据传输至处于目标端口号的应用程序(浏览器)之中,所以我们可以在浏览器通过开发人员工具看到http报文。

请求报文的格式

技术分享图片

响应报文的格式

技术分享图片

报头

报文的首行只是对报文的简短描述,而报头是对报文的详细描述和对请求、回应的控制、报头的值称为指令,用于控制服务端和客户端交互的行为,多个指令可用逗号隔开。除了请求报头Host是必须的,其它报头都是可选的。

请求头

Referer:Referer:http://translate.google.cn
通知服务端,我是通过指定的服务端的链接向你这个服务端发起请求的。
 
Connection:keep-alive | close
值1提醒服务端,应建立持久的TCP连接。值2提醒服务端传输完成立即释放TCP连接。
 
Host:blog.csdn.net
我请求的资源所在的域名和端口号,默认80端口,80不显示。
 
Cookie:xxx
存储的cookie。

Content-Length:80
我发起的请求,其正文的长度。
 
Authorization:xx
我的授权信息存储在此处。服务端可以读取并做出测试。
 
UA-Pixels:xx
我屏幕的大小。
 
UA-Color:xx
我屏幕的颜色深度。
 
UA-OS:xx
我的操作系统。
 
UA-CPU:xx
我的CPU类型。
 
Range:ranges-specifier = byte-ranges-specifier
我将请求端点续传功能,需要服务端确认,可利用端点续传使用多线程下载软件对资源进行分块下载。
当用户在听一首歌的时候,如果听到一半(网络下载了一半),网络断掉了,
用户需要继续听的时候,文件服务器不支持断点的话,
则用户需要重新下载这个文件。而Range支持的话,
客户端应该记录了之前已经读取的文件范围,网络恢复之后,
则向服务器发送读取剩余Range的请求,服务端只需要发送客户端请求的那部分内容,
而不用整个文件发送回客户端,以此节省网络带宽。
如果服务端支持Range,首先要通知客户端(response.setHeader(‘Accept-Ranges‘, ‘bytes‘)),
之后客户端才可以发起带Range的请求。可以请求一个资源多个子范围。
如:
表示请求服务端发送500个字节给我:bytes=0-499
表示从上次的位置开始再续传500字节给我:bytes=500-999
表示最后再续传500个字节给我:bytes=-500
表示续传从第500字节开始及其以后的字节给我:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
续传该资源的第306302到604047个字节,该资源共604048个字节:Content-Range: bytes 306302-604047/604048 
同时指定几个范围:bytes=500-600,601-999
续传总是以状态码206返回,表示ok。
 
If-Modified-Since:GMT时间
服务端总是返回一个静态的html资源,
而客户端首次请求时会将服务端返回的html缓存起来,
并把该资源传输到本地时的时间写入缓存表中,
当下一次发起相同的url请求时,
客户端会将该url对应的资源在缓存表中的缓存时间发送到服务端,
服务端IIS会自动读取该资源在服务端中的最后修改时间,
如果这个时间小于客户端发送的时间,则判定不需要响应这个资源,直接返回http状态码304,
客户端接到这个状态码后会从换存中读取文件。否则判定需要响应更新的资源给客户端,直接返回http状态码200和资源,
客户端接收到状态码后会用新资源替换旧资源,并将新资源传输到本地时的时间更新到缓存表。
 
If-None-Match:33a64df551425fcc55e4d42a148795d9f25f89d4
ETag:33a64df551425fcc55e4d42a148795d9f25f89d4
If-None-Match头由客户端发送,ETag头由服务端发送。每个资源的最后修改时间都交给IIS,
由IIS计算资源的时间戳,当我首次请求某个资源时,
服务端会自动将这个时间戳放在ETag响应头之中,
当下一次我发起相同的url请求时,会将这个时间戳放在If-None-Match请求头之中,
如果两个时间是一样的,则服务端判定不需要响应这个资源,
直接返回http状态码304,我接到这个状态码后会从换存中读取文件。
否则判定需要响应更新的资源给客户端,直接返回http状态码200和资源。
时间戳的算法机制不明,但推荐使用,只需要配置IIS的http响应头的ETag即可。具体配置如下:

在web.config中配置“

<system.webServer>
     <httpProtocol>
          <customHeaders>
               <add name = "ETag" value="&quot;&quot;" />
          </customHeaders>
     </httpProtocol>
</system.webServer>

或在IIS中配置:
 
技术分享图片
 
 
技术分享图片

Pragma:no-cache
通知服务端我没有缓存该资源,请返回请求的资源的最新版。
 
Cache-Control:no-cache | no-store | max-age | max-stale | min-fresh | only-if-cached
缓存控制策略,这是一种双方的约定,取值可以对缓存进行控制,通过设置不同的Cache-Control来控制浏览器、服务端甚至Web代理对缓存的使用策略。
取值:
no-cache:通知服务端检测ETag的值,如果ETag的值与我发送的If-None-Match是一样的,则我会从换存中获取资源,否则,请服务端返回资源的最新版本。
no-store:我没有缓存所请求的资源。

响应头

多个控制指令以逗号隔开。

ETag:33a64df551425fcc55e4d42a148795d9f25f89d4
资源的校验码,与客户端使用If-None-Match配合以便验证资源是否被修改过从而使客户端采取缓存读取文件或从我这里重新返回资源的新版本的策略。
 
Last-Modified:Tue, 08 Feb 2022 11:35:14 GMT
表明资源的最后修改日期。
 
Content-Type:application/x-www-form-urlencoded | application/json ……
通知客户端,我发送的数据的编码方式,编码方式由开发人员设置表单的EncType属性来指定,EncType用于指示在发送到服务器之前应该如何对表单数据进行编码。默认使用"application/x-www-form-urlencoded"进行编码,以下是表单的EncType和Content-Type的取值,两者的取值是完全对应的。
application/x-www-form-urlencoded 默认编码方式,提交的数据是以键值对的形式提交,比如name字段的值是sam,则提交的数据为:name:sam,服务端使用索引或key从数组中提取值
application/json 编码为JSON格式,提交的数据是以Json对象的形式提交,比如name字段的值是sam,则提交的数据为:{ name : ‘sam‘ }
text/html 编码为HTML格式
text/plain 编码为纯文本格式编码
text/xml 编码为XML格式编码
image/gif 编码为gif图片格式编码
image/jpeg 编码为jpg图片格式编码
image/png 编码为png图片格式编码
application/xhtml+xml 编码为XHTML格式编码
application/xml 编码为XML数据格式编码
application/atom+xml 编码为Atom XML聚合格式编码
application/pdf 编码为pdf格式
application/msword 编码为Word文档格式
application/octet-stream 编码为二进制流数据(如常见的文件下载)
encType multipart/form-data 编码为上传文件的格式

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。
用于表明整个返回的资源数据中某一段数据的插入位置和整个资源数据的长度。
例如,传送头500个字节中的子数据:Content-Range:bytes0-499/1234
 
Content-Length:19847
表明返回到客户端的数据的字节大小。
 
Content-Encoding:gzip | deflate
表明返回给客户端的数据的压缩方式

Content-Language:zh-CN | zh | en-US | zh-HK
指定我发送的文件的语言类型,默认任何语言。
 
Server:Server: Microsoft-IIS/7.5
表明我使用的哪种软件承载HTTP服务器。

X-AspNet-Version:4.0.30319
表明ASP.NET的版本。
 
X-Powered-By:ASP.NET
表明网站是用什么技术开发的。
 
Connection:keep-alive | close
值1提醒客户端,应建立持久的TCP连接。值2提醒客户端传输完成立即释放TCP连接。
 
Location:http://xxx
此处表明以前的域名不可用,需要重定向到一个新的位置,此响应头常用在更换域名的时候。
 
Refresh:http://xxx
表明浏览器应在多少秒之后刷新文档,只刷新一次。
也可以通过编程或html编码的方式刷新一次文档。
编程设置自动刷新一次:setHeader("Refresh", "5; URL=http://host/path")
html编码设置:在head标签中设置
<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">
连续刷新需要求每次都发送一个Refresh头,而发送http状态码204则可以阻止浏览器继续刷新。
 
WWW-Authenticate:Basic realm = "Basic Auth Test!"
向客户端表明它还未授权,需要客户端发送请求,请求必须包含Authorization报头,由Authorization报头提供身份信息。
 
Allow:get | post | put | delete……
我支持的请求方式

Date: Tue, 08 Feb 2022 11:35:14 GMT
我返回资源的时间

Expires: Tue, 08 Feb 2022 11:35:14 GMT
通知客户端浏览器,当前请求的资源会在指定时间后过期,此时间后应重新从服务器获取。
 
P3P:CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
跨域设置Cookie, 以便解决iframe跨域访问cookie的问题

Set-Cookie:sc=4c31523a; path=/; domain=.acookie.taobao.com
我向客户端写入的cookie数据。
 
Cache-Control:public | private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage
缓存控制策略,这是一种双方的约定,取值可以对缓存进行控制,通过设置不同的Cache-Control来控制浏览器、服务端甚至Web代理对缓存的使用策略
取值:
Public( 启用了任何客户端或代理端对资源进行缓存的功能 )
技术分享图片
Privat( 禁用了代理端对资源进行缓存的功能 )
no-cache( 我将检测客户端发送的 If-None-Match请求头,如果与ETag一样则通知客户端从缓存中取数据,否则我将返回资源的最新版本 )
no-store( 通知客户端不要缓存所请求的资源 )
max-age( 指示客户端使用缓存读取资源的最大秒数,超过此秒,则我会返回资源的最新版本 )
min-fresh( 超过指定秒数,我将不再返回资源给客户端 )
max-stale( 即使超过指定秒数,我也会返回资源给客户端 )

保持Http的状态(session)

使用url查询字符串保持状态

将数据附加到url查询变量中,以此保持状态。

使用隐藏域保持状态

将数据存入隐藏域随表单提交,服务端再把数据发往隐藏域存储,以此保持状态。

使用cookie保持状态

向客户端写入加密的cookie,以此保持状态。

使用Seesion保持状态 

技术分享图片

session不属于http协议,而为了解决http协议的无状态,比如使用session来保持用户的登录状态,session存储在服务端内存中,而cookie存储在客户端浏览器中,但session的key是写入cookie中的,如果客户端禁用cookie,还可以通过将sessionID附加url查询字符串将中。

Http请求

http请求总是以一个Url链接的格式发起,每一个链接就是一个http请求。一个Url地址描述的是请求的资源在网络上的位置。

ProtocolName://host[:port]/path/.../[?query-string=value&query-string=value][#anchor]
http | https | ftp://域名[:端口号]/资源路径?查询字符串=值&查询字符串=值/#锚链接

http代理服务器 

http代理服务器处于网络分层中的会话层,它是客户端的"服务器",是目标服务器的"客户端"。

虚拟主机

提供商把自己的网络服务器分成N组虚拟空间,这样的空间称为虚拟主机,虚拟主机都具有一定的磁盘空间来存储用户的web程序、应用组件和资源。

 

参考资料  

微醺岁月:TCP协议的三次握手和四次分手

深海的小鱼儿:ARP 数据包格式分析

Du YueHan:TCP的握手分手八卦细节

中国科学技术协会:面向连接的网络层协议

维基百科:資料鏈結層(Data Link Layer)

维基百科:ARP欺骗  

法本如是HTTP之Range理解 

WebWalker如何统一负载均衡环境中IIS的Etag值以提高访问速度 

唐无敌http 401Basic验证和WWW-Authenticate、Authorization 

zzfx:怎样决定一个资源的Cache-Control策略

站长之家:ETag使用效果对比及经验分享

以上是关于网络知识 - 网络传输协议的主要内容,如果未能解决你的问题,请参考以下文章

tcpip协议分为哪几层

网络传输协议

UDS-CAN网络层传输协议

3.协议与端口

网络知识 - 网络传输协议

TCP/IP协议