网络、tcp/ip、http
这是篇无聊的知识,主要摘录于图解http一书。个人感觉,对开发并没有多大帮助,只是补充了一些网络知识而已,因为并不解决实际开发中的问题。
HTTP的诞生
www(简称web)这一提议是致力于全世界的研究者们无视时间和地域的限制进行知识共享。
现在已提出了三项www构建技术:
- Web页面的文本标记语言:HTML
- 文档传输协议:HTTP
- 指定文档所在地址:URL
注:当年HTTP协议的出现主要是为了解决文本传输的难题。由于协议本身非常简单,于是在此基础上设想了很多应用方法并投入了实际应用。现在HTTP协议已经超出了web这个框架的局限,被运用到了各种场景里。
几个名词说明
客户端与服务器端:HTTP协议和TCP/IP协议族内的其它协议相同,用于客户端和服务器端之间的通信。请求访问文本或图像等服务器资源的一端称为客户端(比如web浏览器),而提供资源响应的一端称为服务器端。
协议:协议就是指规则的约定,即都要遵守的一些约定。Web使用一种名为http的协议作为规范,完成从客户端到服务器端等一系列运作流程。可以说,web是建立在HTTP协议上通信的。
网络基础 TCP/IP
TCP/IP 是互联网相关的各类协议族的总称,通常叫 TCP/IP协议族 。
TCP(transmission control protocol,传输控制协议)。
IP(Internet protocol)网际协议 。
计算机与网络设备要相互通信,双方必须基于相同的方法。比如如何探测到通信目标/由哪一方先发起通信/使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们把这种规则称为协议(protocol)。TCP/IP是互联网相关的各类协议族的总称。所以,通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集。
TCP的四个重点:面向连接、可靠传输原理、流量控制、拥塞控制
TCP/IP协议族的分层管理
TCP/IP协议族里最重要的一点就是分层,TCP/IP协议族按层次分别分为以下4层:
应用层、传输层、网络层、数据链路层(和物理层)。
分层并不是在物理上的分层,而是逻辑上的分层。通过对底层逻辑的封装,使得上层的开发可以直接依赖底层的功能而无需理会具体的实现,简便了开发。这种分层的思路,也就是责任链设计模式,通过层层封装,把不同的职责独立起来,更加方便开发、维护等等。
TCP/IP协议族各层的作用
应用层
在传输层的基础上,根据具体的需求开发各种功能,HTTP协议就是处于该层。本质特点是:完成具体的业务需求
传输层
它提供处理网络连接中的两台计算机之间的数据传输。
传输层的协议中比较出名的就是TCP(transmission control protocol,传输控制协议)和 UDP(user data protocol,用户数据报协议)。其中,UDP是最精简的传输层协议,只实现了进程间的通信;而TCP在UDP的基础上,实现了可靠传输、流量控制、拥塞控制、面向连接等等特性,同时也更加复杂。
本质特点是:提供进程之间的逻辑通信, 在网络层的基础上,通过socket(套接字) 对数据进行拆分,实现应用进程的独立网络通信,互不干扰。这里的进程可以是主机之间,也可以是同个主机 。
传输层底层实现:socket
socket并不是一个实实在在的东西,而是传输层抽象出来的一个对象。传输层增加了端口这个概念,来区分不同的socket。端口可以理解为一个主机上有很多的网络通信口,每个网络通信口都有一个端口号,端口的数量由传输层协议确定。
不同的传输层协议对socket有不同的定义方式。
在UDP协议中,使用目标IP+目标端口号来定义一个socket;
在TCP中使用目标IP+目标端口号+源IP+源端口号来定义一个socket。
我们只需要在传输层报文的头部附加上这些信息,目标主机就会知道我们要发送给哪个socket,对应监听该socket的进程就可获得信息。//可以理解成一个应用对应一个socket。
网络层
网络层建立的是主机与主机之间的通信,而传输层则建立了端口与端口之间的通信。这样,一旦确定了主机和端口号之后,你就可以实现程序之间的通信了。
网络层用来处理网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。总的来讲就是通过抽象IP地址实现主机之间的逻辑通信。
链路层
链路层(又称数据链路层、网络接口层、物理层)。它是用来处理连接网络的硬件部分,硬件上的范畴均在链路层的作用范围之内。
TCP/IP通信传输流程
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则从链路层往上走。
用HTTP举例来说明,
- 首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。
- 接着,为了传输方便,在传输层(TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号以及端口号后转发给网络层。
- 在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。
TCP 特点
TCP(transmission control protocol,传输控制协议)是一种面向连接的保证可靠传输的(传输层)协议,通过TCP传输,得到的是一个按顺序写的、无差错的数据流。主要特点:
- 向应用程序提供面向连接的服务,两个需要通过TCP进行数据传输的应用进程之间首先必须建立一个TCP连接,并且在数据传输完成后要释放连接。
- 提供全双工数据传输服务,只要建立了TCP连接,就能在两个应用进程之间进行双向的数据传输服务,但这种传输只是端到端,不支持多播和广播。
- 提供面向字节流的服务,两个建立了TCP连接的应所进程之间交换的是字节流。发送进程以字节流形式发送数据,接受进程也把数据作为字节流来接受。端到端之间不保留数据记录的边界,即在传输层面上不存在数据记录的概念。
TCP的工作过程
- 连接的建立:就是“发送一个校检包给对方然后互相确认”的过程。只有双方都接收到确认信号后,连接才能建立起来。 通信双方“建路”互通。
- 传输数据:利用TCP传输数据时,数据是以字节流的形式存在的。客户端与服务器端建立连接后,发送方首先要将发送的数据转化为字节流,然后才能将它发送给对方。发送数据时,可以通过程序将数据流不断地写入TCP 的发送缓冲区中。然后,TCP会自动从发送缓冲区中提取一定量的数据,将其组成TCP报文段发送到ip层,再通过IP层(网络层)的网络接口发送出去。 接收端从IP层接收到TCP报文段后,会将其暂时保存在接收缓冲区中,然后通过程序依次读取接收缓冲区中的数据,从而达到相互通信的目的。 客户端程序需使用write方法将数据写入发送端的缓冲区中,然后服务器端(接收端)使用read方法从其自己的缓冲区中读取数据。概括起来,TCP传输就是“对数据的读、写操作”。
- 断开连接:略。
UDP 用户数据报协议
UDP(user data protocol,用户数据报协议)是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址和目的地地址,他在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间和内容的正确性都是不能被保证的。因此UDP是一种非常简单的协议,在网络层的基础上实现了应用进程之间端到端的通信。特点如下:
-
UDP是一种无连接协议,传输数据之前信源和信宿不需要建立连接,因此不存在连接建立的时延。在信源端,UDP传送数据的速度仅受应用程序生成数据的速度、计算机的能力和传输宽带的限制。在信宿端,UDP把每个数据报放在队列中,应用程序每次从队列中读取一个数据报。
-
由于传输数据不需要建立连接,也就不需要维护连接,包括收发状态等。这样一台服务器可以同时向多个客户机发送相同的数据,例如实现多播。
-
UDP数据报的首部很短,只有8字节,相对于TCP首部的20字节,开销小很多。
-
吞吐量不受流量控制算法的调节,只受应用软件生成数据的速率、传输宽带、信源和信宿主机性能的限制。
HTTP请求和响应报文
HTTP报文本身就是字符串文本。发送HTTP请求即发送HTTP请求报文,请求报文或者说请求是在应用层生成的。请求报文是由请求方法、请求url、协议版本、可选的请求首部字段和内容实体构成的,如下图:
接收到请求的服务器,会将请求内容的处理结果以相应的形式返回,具体就是响应报文。响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成,如下图:
HTTP协议特点
HTTP是不保存状态的协议
HTTP协议自身不具备保存之前发送过的请求或响应的功能。使用HTTP协议,每当有新的请求发送时,就会有新的响应产生。协议本身并不保留之前的请求或响应报文的信息。
另外只能客户端发起请求时,服务端才能进行响应,即一问一答形式 。
HTTP协议使用URI定位互联网上的资源
当客户端请求访问服务器资源而发送请求时, 需要将请求报文中的请求 URI 包含在内。 指定请求 URI 的方式有很多。
告知服务器意图的HTTP方法
Get:用来获取资源,即向服务器表达“我想要……”。
Post:传输实体主体,即向服务器表达“我要把某某信息告诉你”。Put的主要目的并不是获取响应的主体内容,当然它可以获取到。
PUT:传输文件,即向服务器表达“我要把这份文件发给你”。
HEAD:获得响应报文首部,即向服务器表达“把那个……相关的信息告诉我”。同Get,只是不返回报文主体部分。用于确认URI的有效性以及资源的更新日期时间等。
OPTIONS:询问请求URI指定的资源支持的方法,即向服务器表达“你支持哪些方法”
CONNECT:要求用隧道协议连接代理,主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。
注意:使用以上方法时,这些名字都是要大写的。
建立持久连接
- 产生背景:HTTP初始协议版本中,每进行一次HTTP通信就要断开一次TCP连接。后来发现,如果使用浏览器浏览一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该页面里包含的其它资源。因此,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
持久连接就是解决上述问题的一个方案,持久连接的特点是:只要任意一端没有明确提出断开连接(向报文中显示地添加一个Connection:close首部),则保持TCP连接状态,总之,持久连接旨在建立一次TCP连接后进行多次请求和响应的交互。这样,web页面打开的速度就变快了。在HTTP/1.1中,所有的连接默认都是持久连接。 - 持久连接使得多数请求以管线化(pipelining)方式发送成为可能。
从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应即可直接发送下一个请求。管线化技术比持久连接还快,请求数越多,两者的时间差越明显。
PS:这个东西,貌似对自己前后端编程,程序设计和实现没有多大帮助啊。没有get到有价值的使用场景和方式。
使用cookie的状态管理
HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的的状态进行本次的请求处理。Cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做Set-cookie的首部字段信息,通知客户端保存cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入cookie值后发送出去。服务器端发现客户端发送过来的cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然会对比服务器上的记录,最后得到之前的状态信息。
与HTTP关系密切的协议:IP、TCP和DNS
负责传输的IP协议
按层次分,IP(Internet protocol)网际协议位于网络层。IP协议的作用就是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件,其中两个重要的条件是IP地址和MAC地址(Madia Access Control Address)。
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可以变换,但MAC地址基本上不会改变。IP间的通信依赖MAC地址。
在网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时,会采用ARP协议(Address Resolution Protocol)。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。在到达通信目标前的中转过程中,那些计算机和路由器等网络设备只能获悉很粗略的传输路线。这种机制称为路由选择,有点像快递公司的送货过程。无论哪台计算机、哪台网络设备,他们都无法全面掌握互联网中的细节。
确保可靠性的TCP协议
按层次分,TCP协议位于传输层,提供可靠的字节流服务。所谓的字节流服务是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,TCP协议能够确认数据最终是否送到到对方。
负责域名解析的DNS服务
DNS(domain nname system)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务,即可以通过域名查找IP地址,也可以从IP地址反查找域名。
HTTPS
HTTP 主要有以下几点不足:
- 通信使用明文(不加密) , 内容可能会被窃听。请求和响应的报文都是未经加密的明文方式发送。
- 不验证通信方的身份, 因此有可能遭遇伪装。
- 无法证明报文的完整性, 所以有可能已遭篡改。
这些问题不仅在 HTTP 上出现, 其他未加密的协议中也会存在这类问题。 互联网上的任何角落都存在通信内容被窃听的风险 ,可以对通信报文加密处理后再进行数据传输,虽然这样做也可以被人窥视到,也却是无法破解报文信息的含义的(但可能恶意修改),但相对来讲,这也算是一种保证通信安全的手段。
HTTP+ 加密 + 认证 + 完整性保护=HTTPS
HTTP 协议中没有加密机制, 但可以通过和 SSL(Secure Socket Layer, 安全套接层) 或TLS(Transport Layer Security, 安全层传输协议) 的组合使用,加密 HTTP 的通信内容。用 SSL建立安全通信线路之后, 就可以在这条线路上进行 HTTP通信了。 与 SSL组合使用的 HTTP 被称为 HTTPS(HTTP Secure, 超文本传输安全协议) 。https是对整个通信线路加密处理。
通常, HTTP 直接和 TCP 通信。 当使用 SSL时, 则演变成先和 SSL通信, 再由 SSL和 TCP 通信了。 简言之, 所谓 HTTPS, 其实就是身披SSL协议这层外壳的 HTTP。 在采用 SSL后, HTTP 就拥有了 HTTPS 的加密、 证书和完整性保护这些功能。可以说 SSL协议是当今世界上应用最为广泛的网络安全技术。
响应缓存
响应缓存(Response Caching)则不再基于某个具体的缓存数据,而是将服务端生成的HTTP响应的内容予以缓存。
HTTP/1.1 Caching (缓存规范)
- 只针对方法为 GET 或 HEAD 的请求,这样的请求旨在获取URL所指向的资源或者描述资源的元数据。
缓存会根据一定的规则在本地存储一份原始服务器提供的响应副本,并赋予它一个保质期,保质期内的副本可以直接用来作为后续匹配请求的响应,所以缓存能够避免客户端与原始服务器之间不必要的网络交互。
私有缓存和共享缓存
私有缓存是客户端自己的缓存仅自己用,比如每个用户的浏览器上的缓存。
共享缓存是一份缓存可多人使用,这种类型的缓存一般部署在一个私有网络的代理服务器上,称为缓存代理服务器。
在响应报文中,使用
Cache-Control
报头区分私有缓存和共享缓存:Cache-Control: public|private
http get 和 post 两种请求的区别
- get参数通过url传递,post放在request body中。
- get请求在url中传递的参数是有字符长度限制的,而post的request body没有长度限制。
- get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
- get请求只能进行url编码,而post支持多种编码方式。
- get请求浏览器会主动cache,而post不会。
- get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
- get和post质上就是tcp链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
- get产生一个tcp数据包;post产生两个tcp数据包。对于get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于post,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
相关参考
这一篇TCP总结请收下 - 一只修仙的猿 - 博客园 https://www.cnblogs.com/huan89/p/14446291.html
《图解http》
更新于:2024-01-16