欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

个人笔记之HTTP,HTTPS,TCP

程序员文章站 2024-03-20 15:21:10
...

1.http简介

  HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

2.http工作原理

  HTTP是基于客户/服务器模式,且面向连接的。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。HTTP 默认工作在 TCP 协议 80 端口,但是你也可以改为8080或者其他端口。
  CGI(Common Gateway Interface)公共网关接口是外部扩展应用程序与 Web 服务器交互的一个标准接口。是 HTTP 服务器与你的或其它机器上的程序进行“交谈”的一种工具。
个人笔记之HTTP,HTTPS,TCP

HTTP三点注意事项:

  • HTTP是无连接:客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。采用这种方式可以节省传输时间。
  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。(浏览器显示的内容都有 HTML、XML、GIF、Flash 等,浏览器是通过 MIME Type 区分它们,决定用什么内容什么形式来显示。)
  • HTTP是无状态:HTTP协议是无状态协议,即服务器不保留与客户交易时的任何状态。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

3.http消息结构

  一个HTTP"客户端"是一个应用程序,一个HTTP"服务器"同样也是一个应用程序,主要分为请求报文和响应报文。HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。

3.1请求报文

  客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成:
个人笔记之HTTP,HTTPS,TCP

3.1.1请求行

  请求行分为三部分:请求方法,URL,协议版本。

  1. 请求方法
      请求的类型,常见的是get,post。如果采用RESTful风格的话,get(查询资源)、post(增加资源)、put(更新资源)、delete(删除资源)。
    详细查看https://www.runoob.com/http/http-methods.html
  2. URL
      统一资源定位器(uniform resource locator),请求对应的URL地址,里面包含了资源名称。它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
      URI,统一资源标识符(uniform resource identifier),用来唯一的标识一个资源。总结:只要能唯一标识资源的就是URI,在URI的基础上给出其资源的访问方式的就是URL
  3. 版本协议
      HTTP协议的版本号,详细可以参考https://www.cnblogs.com/luck-pig/p/12006908.html

3.1.2请求头部

  从客户端向服务器发送请求报文时使用的头部,补充了请求的附加内容、客户端信息、相应内容相关优先级信息。格式为“属性名:属性值”。
个人笔记之HTTP,HTTPS,TCP

3.1.3空行

  空行,请求头部后面的空行是必须的,即使第四部分的请求数据为空,也必须有空行。

3.1.4请求数据

  将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。

  不但报文体可以传递请求参数,请求URL也可以通过类似的方式请求参数;例如: /chapter15/user.html? param1=value1&param2=value2

GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

name=tom&password=1234

3.2响应报文

  HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
个人笔记之HTTP,HTTPS,TCP

3.2.1状态行

  状态行由三部分构成:报文协议版本,状态码,状态描述。
  常见的状态码:

  • 200(“OK”):请求已成功。出现此状态码是表示正常状态。
  • 301(“Moved Permanently”):被请求的资源已永久移动到新位置URL,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
  • 400(“Bad Request”):语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
  • 404(“Not Found”) :请求失败,请求所希望得到的资源未被在服务器上发现。
  • 409(“Conflict”):由于和被请求的资源的当前状态之间存在冲突,请求无法完成。
  • 410(“Gone”):被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。和404的区别是:404是暂时的,它是永久的。
  • 500(“Internal Server Error”):服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。

3.2.2消息报头

  也是由多个属性组成。格式为“属性名:属性值”。详细参见如下:
https://blog.****.net/garrettzxd/article/details/81105423

3.2.3空行

  和请求报文的空行类似

3.2.4响应正文

  即我们真正需要的从数据库中取出的数据

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

4.https的介绍

  HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。而HTTP 协议以明文方式发送内容,不提供任何方式的数据加密。HTTPS 默认工作在 TCP 协议443端口。

  

5.https的工作原理

  

  

6.TCP报文结构

个人笔记之HTTP,HTTPS,TCP
确认ACK:当ACK=1时,确认字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对*同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。故SYN置为1,就表示这是一个连接请求和连接接收报文。
终止FIN:用来释放连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
详细参考https://www.cnblogs.com/kaleidoscope/p/9701117.html

7.TCP的三次握手

  在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接。
个人笔记之HTTP,HTTPS,TCP

  1. 客户端尝试连接服务器,发送连接请求报文段,将SYN标识位置为1,向seq(Sequence Number)置为x,然后进入 SYN_SEND 状态等待服务器确认。
  2. 服务器收到SYN报文段进行确认,将SYN标识位置为1,ACK置为1,seq置为y,ack(Acknowledgment Number)置为x+1(表示对上次握手的seq的确认),然后进入SYN_RECV状态,这个状态被称为半连接状态。
  3. 客户端再进行一次确认,将ACK置为1(此时不用SYN),seq置为x+1,ack置为y+1(表示对上次握手的seq的确认)发向服务器,最后客户端与服务器都进入ESTABLISHED状态。

7.1为什么要三次握手

  三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。 举个例子:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ack包。

8.TCP四次挥手

  TCP三次握手是TCP连接建立的过程,TCP四次挥手则是TCP连接释放的过程。下面是TCP四次挥手的流程图:
个人笔记之HTTP,HTTPS,TCP
  当客户端没有数据再需要发送给服务端时,就需要释放客户端的连接,这整个过程为:

  1. 客户端发送一个报文给服务端(没有数据),其中FIN设置为1,seq置为u,客户端进入FIN_WAIT_1状态。
  2. 服务端收到来自客户端的请求,发送一个ACK=1给客户端,ack置为u+1,同时发送seq为v,服务端进入CLOSE_WAIT状态,客户端收到后进入FIN_WAIT_2状态。
  3. 服务端发送一个FIN给客户端,ACK置为1,seq置为w,ack置为u+1,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。
  4. 客户端收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给服务端,Acknowledge置为w+1,Sequence Number置为u+1,最后客户端和服务端都进入CLOSED状态。

8.1为什么要等待2MSL

  等待2MSL(两个报文最大生命周期),等待这段时间就是为了如果接收到了重发的FIN请求能够进行最后一次ACK回复,让在网络中延迟的FIN/ACK数据都消失在网络中,不会对后续连接造成影响。