个人笔记之HTTP,HTTPS,TCP

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三点注意事项:

  • 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)、空行和请求数据四个部分组成:
在这里插入图片描述

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请求头部

  从客户端向服务器发送请求报文时使用的头部,补充了请求的附加内容、客户端信息、相应内容相关优先级信息。格式为“属性名:属性值”。
在这里插入图片描述

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响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
在这里插入图片描述

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.csdn.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端口。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

  https的工作流程如下:

  1. TCP 三次同步握手
  2. 客户端验证服务器数字证书
  3. DH 算法协商对称加密算法的密钥、hash 算法的密钥
  4. SSL 安全加密隧道协商完成
  5. 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。

详情可以参考https://www.bilibili.com/video/BV1w4411m7GL?from=search&seid=10894733333584532455

5.https的工作原理

  HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。在采用SSL后,HTTP就拥有了HTTPS的加密证书完整性保护这些功能。
在这里插入图片描述
在这里插入图片描述
  HTTPS 协议的主要功能基本都依赖于 TLS/SSL 协议,TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商对称加密算法采用协商的密钥对数据加密基于散列函数验证信息的完整性。
在这里插入图片描述
详细参考:https://segmentfault.com/a/1190000018992153

6.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协议通过三次握手建立一个可靠的连接。
在这里插入图片描述

  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四次挥手的流程图:
在这里插入图片描述
  当客户端没有数据再需要发送给服务端时,就需要释放客户端的连接,这整个过程为:

  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数据都消失在网络中,不会对后续连接造成影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值