Http/Https/TCP详解_http属于ipv4报文吗-程序员宅基地

技术标签: web应用测试学习  http  https  tcp/ip  

Http/Https详解和TCP

复杂网络环境

host主机 A—数据丢包—数据重复—数据完整性校验—数字转换模拟信息–。。。。—信号衰减—host主机 B

网络分层

网络通信在不同方面是有层次结构的,每一层仅于他上一层或者下一层进行交互,只要层与层之间接口不变就不会影响其他层

**OSI七层模型:**应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。

TCP/IP 5层模型:应用层、传输层、网络层、数据链路层、物理层

传输层协议:TCP、UDP、SCTP

网络层协议:ipv4、v6,ARP、ICMP

数据链路层协议:以太网、无线LAN

在这里插入图片描述

HTTP协议

Http协议使用的是SOCK_STREAM类型套接字进行传输的,毕竟浏览器要解析网页,数据就不能出现错误的地方
深入理解Socket套接字原理_Princesk的博客-程序员宅基地
http1.0使用短连接方式访问。

http1.1开始默认使用长连接,响应头会加上Connection:keep-alive这句表示使用长连接,但对于服务器来说这本身是不现实的,所以服务器端有一些自定义连接策略来防止客户端长时间连接导致的服务端资源占用。

对于HTTP协议,因为使用时TCP协议建立连接的所以HTTP的长短连接实际就是TCP的长短连接。

在这里插入图片描述

无状态以请求和应答方式运行的协议,使用可扩展语义和自描述消息格式

**无状态:**指不存储用户信息

**可扩展语义:**使用头部字段定义所需要信息

**自描述消息格式:**数据可以是文本图片音频等

1、http报文格式

http报文格式=起始行+头部字段集合+空行+消息正文

**起始行:**描述请求或响应的基本信息,GET /inedex.html HTTP/1.1或者HTTP/1.1 200 ok,header.

**头部字段集合:**使用键值对形式详细说明报文,connection:keep-alive

**消息正文:**实际传输数据可以是任何满足条件数据,

网页数据

1.1、请求报文格式

格式=method+空格+url+空格+version+换行符

请求方法method

get/post/head/put/delete

请求目标URL:

URL标记请求资源位置

版本号version

http协议版本(1.0之后有,1.1后标准化)

1.2、响应报文格式

格式=version+空格+statusCode+空格+reason+换行符

版本号version

表示http协议版本

状态码StatusCode

一个三位数,用代码表示服务器处理结果

  1. 1**,服务器收到请求,需要请求者继续执行操作

    100继续,101服务器根据客户端请求切换请求的协议如请求切换http1.1

  2. 2**,成功,操作被成功接收并处理

    200 200ok请求get和post常见 204 无内容,服务器处理成功但是没有返回内容,浏览器会先确保当前显示页面
    201 已创建请求所需资源 205 充值内容,服务器处理成功,重置用户视图
    202 接收请求但没有完成处理 206 只有部分内容被处理,且是get请求
    203 非授权信息请求成功,但返回的meta信息不在原始服务器,是副本处理的
  3. 3**,重定向,需要进一步操作完成请求

    300 多种选择,请求资源来自多个位置需要用户在返回的列表选择 304 未修改。所请求资源没有修改,此状态下服务器不返回任何东西
    **301 **永久移动,请求资源被永久移动到新url,返回信息包括新uri浏览器也会自动定向到新url 305 使用代理,所求资源需要代理才能访问
    302 临时移动,301类似,但是资源只是临时移动,所以C端先继续使用当前url 306
    303 查看了其他地址。使用get和post请求查看 307 临时重定向状态参考307
  4. 4**,客户端错误,请求包含语法错误或无法完成请求

    400 服务器无法理解,客户端请求语法错误 405 客户端请求中方法禁止
    401 请求要求用户的身份验证 406 服务器无法根据内容特性完成请求
    402 保留 407 与401类似,但是要使用代理服务器进行授权
    403 服务器理解客户端请求,但是拒绝执行 408 超时,服务器等待客户发送请求时间超时
    404 服务器无法更具C端请求找到资源 409 服务器完成客户端put请求,但是发生了冲突
    411 服务器无法处理客户端发送的不带content-length的请求信息 410 客户端请求资源不存在
  5. 5**,服务端错误,但是处理过程中发生了错误

    500 服务器内部错误 503 服务器超载或系统维护,暂时无法处理客户端请求
    501 服务器不支持该请求 504 充当网关或代理服务器没有及时获取该请求
    502 代理服务器收到一个无效请求 505 服务器不支持C端http协议的当前版本postman简介
原因Reason

作为数字状态码进行补充,更加详细的解释文字

2、 http头字段header

以键值对形式存在,用CRLF表示字段结束。如果是前后端分离项目,经常需要content-type:application/json,来让后端处理json数据。

由于http的可扩展性,所以我们处理标准的host或者connection等已经存在的header同时,支持添加其他自定义头

响应头 说明
allow 服务器支持哪些请求方法
content-encoding 文档编码方法,只有编码后才可以得到content-type头指定文件
content-length 表示内容长度,当浏览器使用持久http连接才需要这个数据
content-type 表示文档属于什么mime类型,servlet默认text/plain,但通常是text/html。httpservletresponse提供一个专用方法setcontenttype(跟开发有关)
date 设置gmt时间,用setdateheader来设置这个头以避免转换时间格式麻烦(返回服务器相对于当地的时间记得时区+8)
expires 决定文档在什么时候过期,而不再进行缓存
www-authenticate 客户应该在authorization头中提供什么类型的授权信息,包含401状体行的应答中这个头是必须的
last-modified 文档最后改动时间,客户通过if-modified-scine请求头提供一个日期,该请求头会被视为一个条件get,只有改动时间迟于指定时间文档才能返回,否则是304状态
location 表示用户去哪里提取文档,location不是直接设置的通常使用httpservletresponse的sendRedirect方法,状态码302
refresh 表示浏览器应在多少时间后去刷新文档,秒记,指的是n秒后刷新本页面或访问指定页面
server 服务器名字,web服务器自己定义
set-cookies 设置和页面关联的cookies

在这里插入图片描述

header数据内部顺序不影响语义

3、http请求完整过程

在这里插入图片描述

HTTPS协议

针对网络传输的安全性,向http协议内加入ssl/tsl安全套接层对http协议的请求和响应报文进行加密

在这里插入图片描述

1、对称加密和非对称加密

对称加密

使用相同加解密密钥,高效适用于大量数据加密场景,算法公开,安全性取决于密钥大小,但密钥越大效率越低

非对称加密

生成一对匹配的密钥分别进行加密和解密,两个公钥一个私钥(先有私钥,然后根据私钥生成公钥)

公钥加密

针对加密数据发送

在这里插入图片描述

私钥签名

将明文公布给别人,同时证明该明文是自己发的。

  1. A将明文和通过该明文在A私钥下生成的hash值(密文签名发送给B)
  2. B通过A的公钥A的hash值,然后跟A发送过来的密文签名做对比,判断是否A发送信息

2、https请求前SSL/TSL完整过程

在这里插入图片描述

  1. 首先有一个CA权威机构专门存储各个服务器的CA证书,各个客户都自带CA机构的公钥
  2. 每个服务器的CA证书都是用该服务器本身的公钥A和域名依照CA机构私钥生成的,
  3. 浏览器请求某个服务器访问,会先去CA机构下载该服务器的证书,通过CA机构公钥解密出该服务器的域名和公钥
  4. 以上三步后,浏览器会自己生成浏览器的对称加密密钥,然后依照CA证书解密后的访问服务器的公钥将浏览器的对称加密密钥生成一个密文,通过域名发给服务器。
  5. 服务器获取到该密文和通过自己的服务器私钥进行解密,获取到浏览器的对称加密密钥,然后通知发送密文浏览器我已经接收到对称加密密钥

执行完上述加密步骤后,浏览器才会请求数据响应报文,建立TCP链接(参照)

TCP协议

特点

  1. 基于连接使用的双向数据传递(全双工),因为到达目的地的数据路径是不固定的
  2. 不限制数据大小,数据打包成报文段保证有序接收,重复报文自动丢弃。会自己校对是否丢包,丢包后客户端会要求服务器重发
  3. 保证数据可到达,丢包时通过重发机制保证发送的可靠性
  4. 可以有效防止网络出现恶性拥堵

基于tcp连接四元组:目的地址、目的端口、源地址、源端口

实际连接时五元组,除以上四要素外还要考虑协议头

1、TCP如何看到应用交付数据

tcp协议将应用传递的数据仅仅当成一连串的无结构字节流,tcp不会理解字节流的含义也不会考虑应用程序会将多大数据加入到tcp的缓存中,tcp只会根据对端(连接的远端)给出的窗口(涉及替代重发机制的滑动窗口协议)和当前网络状况来决定一个报文应该包含多少字节。

总结,TCP协议只是打工人,只决定一次发送多少数据。

在这里插入图片描述

2、tcp报文组成

Sourece port(源端口,客户端随机生成) Dest port(目的端口)
Sequence number
Acknowledgment number
headerlength(报文长度),unused/cwr/ECE/URG/ACK/PSH/RST/SYN/FIN(报文标识) Receive Window(当前服务器可接收数据大小)
Internet checksum() Urgent data pointer(紧急数据处理指针)
options(可选参数)
data(放置http协议数据)

3、tcp三次握手建立连接

  1. 客户端进入SYN-Sent状态,向服务器发送SYN,seq=x报文,此时服务器接收报文,进入监听状态,存储当次报文内信息(目的端口、目的ip、序号、应答号等信息)
  2. 服务端接收信息后会发送ACK报文和SYN seq=Y(对客户端发送的SYN seq=X的响应报文)报文,告诉客户端连接建立信息收到预计建立连接,客户端进入Established状态
  3. 客户端在收到服务端确认报文后,向服务端再次发送ACK报文接收确认报文(ACK ack=y+1),此时服务端接收后同时进入established状态,两端建立连接

服务端状态

在这里插入图片描述

4、tcp四次挥手断开连接

在这里插入图片描述

  1. 客户端发送FIN类型TCP数据包,代表客户端不在发送数据
  2. 服务端收到请求,开始应答(ACK),避免客户端重新发送FIN数据包(ACK 包告诉客户端)
  3. 服务端处理完数据后关闭连接,像客户端发送FIN请求包
  4. 客户端收到服务端FIN包后像服务端发送ACK进行二次确认
  5. 客户端等待2msl后在释放连接,防止报文丢失和重发以及新连接造成数据扰乱

挥手等待时间长是为了防止客户端由于丢包等原因没有获取到服务端发来的ACK的TCP报文,留出空余时间等待重发。

还有就是防止造成新建立连接时的缓慢,因为正常断开连接是要关闭端口的,若是断开时有服务端其他进程也要使用该端口建立连接,而断开该端口连接的进程还没有执行完毕,则会造成进程冲突,这就会导致新连接建立缓慢。

5、TCP的连接类型

TCP的连接方式有两种类型,TCP长连接和TCP短连接。

  • 长连接

    在一个TCP连接上同时发送多个数据包。连接保持期间,双方都没有数据包发送则双方互发链路检测包确认是否断开。TCP使用SOCKET套接字建立长连接

  • 短连接

    只有在需要发送时才去建立连接,发送完成就断开,不参考长连接一直存在的方式进行连接

长连接出现于作用于需要频繁信息交互的点对点通讯,连接数不能太多且对于TCP连接每次建立都要进行三次握手浪费时间,影响系统资源的使用。

短连接出现作用于类似web网站类似的服务,连接传输一次本地就能满足一些固定操作,可以有效节省服务器的系统资源。总不能每个用户都是用长连接访问网页。

6、TCP滑动窗口协议和累计确认

比延时重发重传更加有效的机制

在这里插入图片描述

假设tcp一个窗口有五个报文,中间3报文丢失,最后对端校验发现3报文数据丢失,则对端要求下一次发送窗口时应当包含丢失的报文

深入理解HTTP协议与TCP/IP的关系

http协议的长连接与短连接本质是TCP协议的长连接和短连接。

http属于应用层协议。传输时才会在传输层使用TCP协议,在网络层使用IP协议。

IP协议解决网络路由寻址问题,TCP解决在ip层进行可靠的数据包传递,似的收发两端保证正常的通讯。对于TCP,建立连接是在传输层,所以只有传输层才需要在http协议通信时建立链接

1、不同版本http协议的连接方式

Http1.0

该版本中默认使用短连接方式,客户服务端每进行一次http请求处理,就建立一次连接,任务结束就中断连接。如果客户端浏览器访问网页时需要包含其他的web资源,浏览器就以此资源为基础重新建立一个htpp会话连接。

http1.1

默认使用长连接方式,响应头会添加Connection:keep-alive表示长连接。

对于长连接情况,网页一旦被打开,客户服务两端用于传输数据的TCP就不会关闭,客户端如果再次访问该服务器,那么还是会使用这个已经建立连接TCP连接。

但对于长连接来说长期保持是不现实的不同的服务器有不同的处理方式,常见的就是设置连接时间

2、http长轮询与短轮询

短轮询

页面的某个信息实时保持与服务器一致,固定每隔一段时间重新发起http请求

长轮询

相较于短轮询的不停发起请求服务端实时处理请求使客户端获取信息,长轮询在服务器检测到请求内容没有发生过变化会直接将请求内容挂起一段时间,也就是不给客户端进行响应。在这个等待时间内服务器回去检测请求的信息是否发生变化,如果发生变化就处理请求返回,没有发生就挂着直到超时为止。

相较于短轮询,长轮询会造成服务端系统资源浪费,但是却不占据客户端的网络流量

长短轮询和长短连接的区别

  • 实现方式,轮询长短是由服务器后端处理来决定,而连接长短是协议决定的
  • 连接方式,tcp连接是否为长连接是通过httpConnectionHeader来决定需要两端都设置才能有效,而对于轮询只能有服务端决定
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Princesk/article/details/123464709

智能推荐

Scene Text Image Super-Resolution in the Wild-程序员宅基地

文章浏览阅读937次。Scene Text Image Super-Resolution in the Wild ECCV2020上的一篇文章,作者来自商汤研究院、香港大学等。Motivation文章的主要动机有以下几点:现代文本识别技术在清晰本文上已经取得了很好的识别效果,但是在识别低分辨率文本图像时,表现性能急剧下降,主要困难在于光学退化模糊了字符形状,所以作者提到将超分作为文本识别任务的预处理过程非常有必要。目前大多数SISR方法是在特定下采样核(Bicubic)的低分辨率图像上进行训练,不能很好地推广到真实的_scene text image super-resolution in the wild

深入分析MPU6050在ESP32的实现流程_esp32 mpu6050-程序员宅基地

文章浏览阅读1k次。概念与操作描述一种用于在集成电路之间进行数据传输的串行通信协议。主设备(Master)发起通信并控制整个数据传输过程的设备。从设备(Slave)被动响应主设备请求的设备。数据线(SDA)双向的数据线,用于传输数据。时钟线(SCL)主设备通过时钟线控制数据的传输速率。地址每个从设备在总线上具有唯一的地址,用于识别设备。读写操作主设备向从设备发送读取或写入命令,用于读取从设备的数据或向从设备写入数据。应答(ACK/NACK)_esp32 mpu6050

畅购商城第五天_商城系统 es商品搜索排序-程序员宅基地

文章浏览阅读736次。第5章 商品搜索学习目标Elasticsearch安装docker安装Elasticsearch系统参数问题跨域操作IK分词器配置Kibana的使用->DSL语句Kibana->DSL语句操作->ElasticsearchES导入商品搜索数据Sku数据导入到ElasticsearchMap数据类型->Object关键词搜索->能够实现搜索流程代码的编写分类统计搜索1. Elasticsearch 安装我们之前已经使_商城系统 es商品搜索排序

(BDCI-CCF)出租车发票识别_出租车发票识别ccf-程序员宅基地

文章浏览阅读3.1k次,点赞4次,收藏16次。参考文章:​​​​​​百度AI攻略:出租车票识别_才能我浪费的博客-程序员宅基地附完整python源码)基于tensorflow、opencv的入门案例_发票识别一:关键区域定位_小白来搬家-程序员宅基地_python发票识别注:感谢一起完成项目的队友们大赛官网:出租车发票识别 Competitions - DataFountain一、赛题说明1.赛题背景出租车发票在日常财务发票报销中较为常见,由于这类发票样式丰富,区域性特点明显,并且包含大量模糊字迹和错位字迹,因此准确的定位发票_出租车发票识别ccf

c++协程3 (boost::coroutine)_c++ boost什么版本支持协程-程序员宅基地

文章浏览阅读2.6k次。#include #include #include #include using boost::coroutines::coroutine;void cooperative(coroutine>::pull_type &source){ auto args = source.get(); std::cout (args) (args) << '\n'; source()_c++ boost什么版本支持协程

数据结构与算法 - 线性表(完整代码)_线性表完整程序代码-程序员宅基地

文章浏览阅读5.3k次,点赞7次,收藏32次。样例输入:3 //输入一个数a,后面将输入a个数据元素8 9 3 //a个数据元素,依次插入尾结点后。形成单链表结点序列:8,9,33 //输入一个数b,后面将再输入b个数据元素10 89 22 //b个数据元素,依次插入0号结点后。形成单链表结点序列:8,22,89,10,9,389 //删除一个值为89的结点1 //删除1号结点样例输出:8 10 9 3#inc..._线性表完整程序代码

随便推点

阿里云企业级云网络解决方案,助力企业构建安全可靠的云网络_吴天议-程序员宅基地

文章浏览阅读271次。面向云原生时代,阿里云网络推出了企业级云网络解决方案,以及云企业网TransitRouter,私网连接PrivateLink,信用型负载均衡ALB等新产品,旨在满足不同行业的企业应用上云的需求。阿里云资深产品专家吴天议,在云计算情报局分享了阿里云网络如何思考企业上云面临的网络挑战及其应对策略。据介绍,当上云成为企业必选项后,如何在云上安全高效的开展业务,成为了每家企业都需要面临的问题。云网络作为最重要的基础设施,对企业上层应用稳定开展至关重要。阿里云企业级云网络方案可以为企业构建一个高安全、高可靠、符合企_吴天议

nodejs如何调用电脑上的软件读取目标文件-程序员宅基地

文章浏览阅读76次。可以使用 Node.js 的子进程模块来调用电脑上的软件。例如,假设你想使用电脑上的 cat 命令来读取文件,你可以这样写:const { spawn } = require('child_process');const cat = spawn('cat', ['path/to/file']);cat.stdout.on('data', (data) => { console..._nodejs 打开软件

Kubernetes + CRI + Kata + Firecracker -程序员宅基地

文章浏览阅读835次。KataKata源自希腊文Καταπίστευμα(ka-ta-PI-stev-ma),原意是值得信任的人,kata container正是解容器安全的问题而诞生的。传统的容器是基于namespace和cgroup进行隔离,在带来轻量简洁的同时,也带来了安全的隐患。事实上容器虽然提供一个与系统中的其它进程资源相隔离的执行环境,但是与宿主机系统是共享内核..._kata+stratovirt

[转]使用C#进行点对点通讯和文件传输(发送接收部分)-程序员宅基地

文章浏览阅读131次。上面介绍了通讯的基类,下面就是使用那个类进行发送和接收的部分: 二、发送部分: 发送咱们使用了多线程,可以同时进行多个任务,比如发送文件、发送文本等,互不影响: 发送文本方法: private void StartSendText(string strHost,int iPort,string strInfo) { SendText stText = new SendText(strHost,iP..._c# edi 报文发送接收

swift5.5异常的处理的三种的方式_swift5 运行时异常-程序员宅基地

文章浏览阅读179次。swift5.5异常的处理的三种的方式override func viewDidLoad() { super.viewDidLoad() method1() method2() method3() } func method3(){ //方式3 太危险,直接强制解包 不推荐 let pattern = "abc" let regex = try! NSRegularExpre_swift5 运行时异常

illumina 二代测序原理及过程_illumina测序原理及流程-程序员宅基地

文章浏览阅读1.1w次,点赞14次,收藏87次。illumina 二代测序原理及过程_illumina测序原理及流程

推荐文章

热门文章

相关标签