被问到到http的时候你就这么回答!
大家好,我是标题党,啊不,我是小雨小雨,致力于分享有趣的、实用的技术文章。
内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步。
分享不易,希望能够得到大家的支持和关注。
什么是互联网
互联网是指 凡是 能彼此通信的设备组成的网络就叫互联网,指利用TCP/IP
通讯协定所创建的各种网络,是国际上最大的互联网,也称“国际互联网”。
其中TCP/IP
是网络的基础通信架构,提供了点对点链接的机制。并且将软件通信过程抽象化为四个抽象层,下层服务上层,也就是我们熟悉的七层OSI模型。(也就是说TPC/IP
是联网的基础,由他衍生出了OSI
)
OSI
模型是一个视图使各种计算机在世界范围能互连接为网络的标准框架,也就是说是网络互接的标准。(大白话就是规则。按照这个规则,我们就能联网)
用一张图表示OSI
模型:
如果讨论TCP/IP的时候,我们又可以分为四层,如下图:
看看就好,我们要关注的是应用层的http和传输层的tcp,对了,两个模型的对应关系如下:
由于TCP、UDP位于传输层,HTTP位于应用层,按照下层服务于上层的机制,我们从TCP、UDP开始说起。
UDP是什么
UDP位于OSI模型的传输层,是一种无连接的协议,该标准定义的内容很专一,就是数据无脑发数据,不管天崩地裂,海枯石烂,发就完了。为啥这个莽夫是不可靠的呢?
- 无连接:就比如小雨去上班,不管他周内还是周末,上就完了,自然而然就会有一些问题发生
- 恒速:这个莽夫没有拥塞控制系统,也就是不会变通,一根筋按照一个频率进行发收运动,就算对方受不了了,UDP也不会改变它的频率。
- 简单:这货头部开销小,只有八字节,比tcp要少三倍左右,所以就很快。
不过,正由于UDP的快,也有一些场景是非他莫属的,比如DNS啊、音视频啊、实时游戏啊、聊天工具啊巴拉巴拉...
可能有人会问,DNS这种使用UDP会不会有问题啊,比如UDP丢包了,那岂不是返回404了啊。
没错,但是浏览器响应时间大致分为以下三个:
DNS解析 + TCP链接 + HTTP请求/响应
除了DNS能用UDP,其他二位也没法用啊,不然网站丢内容了啊。而且还有备选方案,某种情况下失败了会利用TCP重新查询的,不只是有UDP一种。
可能还有人会问,那聊天工具这种用UDP这问题大了啊,我要是跟我女神表白,这莽夫只管发,结果各种丢包(发送失败),而且我还不知道,那我心态崩了啊。我以为她知道,结果她不知道,然后她还不回我,你让我咋想...
只能说,为啥不能给女神留下神秘感,让她来主动找你呢,哈哈哈
其实通讯工具一般会发送两次,UDP发送一个消息后,如果服务器收到了,会用UDP在返你一个消息,如果没返回,或者发送失败,你就会收到发送失败类似的消息啦,去表白吧,没事的,消息肯定发的出去,答不答应就看自己了。
总的来说,在某些对速度要求极高,但是准确性要求低的情况,UDP是很适合的。
TCP是什么
UDP莽夫不靠谱,TCP小伙来弥补。
关于TCP,我觉得可以用拟人化来代表,众所周知TCP是全双工的吗,其实就是两个独立的人在进行微信聊天。光一个人发是不行的,另一个人也得发,不然聊个j。
那TCP怎么就靠谱了呢?
没错,小伙看日历了!!!而且更厉害的是,他休假的时候也会看日历!!!
其实就是TCP在发送数据的前后,会进行连接创建和连接终止的操作。保证事务完整性。这就是我们经常被问到的问题:三次握手和四次挥手。
三次握手创建连接
提前声明,关于每个标志的格式和内容是什么,这里不做讨论,有兴趣的自行研究。这些定义用到的时候再查就好。
在此之前,要先解释几个名词(又是名词,大白话不好吗 doge~)
- SYN: 表示建立连接,如果我给你的消息里有这个标志,说明我想和你负距离接触,当然这是双向的,你也可以给我发。
- FIN: 表示关闭连接,同上,不过表示我好了,请你离开
- SEQ: 表示初始包序号,随时间变化。就是说我希望你从从这数字开始计数,其实就是确保双方都是本人,不能随便带个序号来都能进行工作,那就乱了
- ACK: 表示响应,就是说我成功得到了你给我的内容
- PSH: 表示有DATA数据传输
- RST: 表示连接重置。
好,进入正题,先看张图吧
看完图可能就豁然开朗了吧。不过,其实我还少说了一部分,这些内容的值是什么呢? 咱们看个建立链接的真实例子(访问百度的抓包)吧!
可以清楚地看到,经过三次tcp握手后,通道建立成功,然后发送了http请求,也侧向验证了传输层服务应用层。
还可以看到每次发送tcp的时候,seq ack这类值都会发生变化,这个是关键,上面说了他们的定义,但是没说为啥要用这些。
这是因为我们要确认连接双方的确定性,进而建立可靠连接。
客户端发送请求连接百度,然后发送带有SYN标志的tcp到服务端,告诉服务端,我想和你连接。
服务端如果没收到,那就算了,如果收到了,就会返回表示接收到了的ACK信号,并发送服务端的SYN与客户端建立连接,这是双向的、可靠地。
如果服务端发送过客户端没收到呢?服务端会定时重新发送,知道成功或超过最大限制未知。简化版心跳机制吧。
客户端收到了服务端发的SYN和ACK,会再次发送代表接收到了的ACK信号,告诉服务端,我ok了
上图中后两次ACK的值为1就代表是响应成功1次。
其实更通俗的来讲,就是下一次的tcp通信要能证明上一次的tcp通信是成功的。
就比如说ack,我第一次请求连接的时候,初始ack肯定为0,然后你发给我的为1,就证明了我第一次请求是成功的,反之亦然,可以自己思考一下,有问题欢迎交流。
到这里可能有人会问,为啥一定是三次呢?因为下一次的tcp通信要能证明上一次的tcp通信是成功的啊。不然你试试两次,看看能不能证明。这是的三次是最小次数,保证效率,三次通信以上理论上都是可以的,但是没必要。
四次挥手断开连接
四次挥手其实和上面差不多,不过SYN变成了FIN,用来'触发'断开连接操作。操作其实是一样的。
那为啥不能和创建连接一样,三次不就好了嘛,还效率。
举个可能不算恰当的例子:创建连接是往一个空的容器里加东西,加就完了,反正刚开始是空的。而断开连接在不加东西之后,还需要将容器里的东西清理掉,有始有终。
一图以蔽之:
还不明白,私聊我,我怼怼你!!!
好了,传输层任务完成,应用层启动~
HTTP和HTTPS
能说的很多,但是感觉又没啥好说的,随便说说吧就。
首先我们知道https就是http,不过加了一层安全控制: SSL/TLS。
怎么就安全了捏?
我们知道http是明文传输的,也无法校验内容的完整性。并且由于是无状态链接,所以也不知道这东西是谁发的,会不会被人改过。
那https的s到底做了啥?
加密!
对称加密
就是我们门禁,对,就宾馆的那种。我们可以将要发送的内容保护起来,放到宾馆里,然后通过门禁(密钥)来访问内容。看起来很安全哈。但是如果这个门禁被人偷偷拿走复制了一份,那我们的内容就可以被其他人随意访问了。这是不靠谱的,我们没隐私了,赤裸裸~
非对称加密
我们换个方案吧,我们让宾馆提供两张门禁卡,一个公开的,所有人都可以知道,一个是私有的,只有负责人才知道,然后宾馆的房间改为两道门,外面的门可以用公开的门禁打开(公钥加密),里面的门可以用私钥打开(私钥解密),并且里面的门有一个通道,可以让有公钥的人将内容放到房间内。由于里面的门只能用私钥打开,所以只有负责人能够查看这个内容。
这就是非对称加密,使用两个密钥,一个是公开的 - 公钥,一个是私密的 - 密钥。然后我们把公钥散播出去就可以了。
但是非对称加密的速度比对称加密要慢很多,这也不是我们想要的。并且单纯的非对称加密,只能保证用公钥加密私密信息只能被拥有私钥的负责人查看。
ps: 笔者还有个问题想不明白,如果公钥随意分发,那有图谋不轨的人随意进行通信,虽然没问题,可以通过服务端进行控制。但是这样感觉怪怪的~
怎么能让它快起来呢?
对称加密和非对称加密混这用,对称加密用于内容,非对称加密用于对称加密密钥的传输。
这样我们就只用到了一次非对称加密,然后就可以用对称加密进行内容的解析。大大提升的速度。
但是这其中有个很严重的问题。如果在服务器发送对称加密密钥的时候,被某个坏人截取到了,这样不但获取到了服务器的公钥,还可以给浏览器发送他的公钥,相当于中间人的角色。浏览器和服务器在不知情的情况下进行危险的通信活动。
怎么证明公钥的正确性
这就要利用非对称加密的另一个功能,数字证书。因为私钥是唯一,所以我们可以用私钥进行加密(签名),这样只有正确的公钥才能开锁。保证了内容是安全的。
并且需要浏览器内置一些安全的公钥,用于解析这个证书,这就是证书中心(CA)的作用了。证书中心是一个绝对有保障的组织,他们会和操作系统、浏览器厂商协定,将证书中心(CA)的公钥提前种好。
上面是前提,接下来,服务器会提前找证书中心为公钥做认证,然后返回服务器数字证书。证书的内容是通过证书中心私钥加密过得服务器相关信息和服务器公钥,这样就保证了公钥无法被篡改,保障了安全。
之后浏览器在请求的时候,就会获取到正确的公钥。之后服务器返回内容的时候也会进行一步处理,保障内容不会被篡改。
浏览器会返回两部分,一部分是明文的hash算法结果。一部分是用服务器私钥加密过得明文的hash算法结果,然后浏览器在获取后,会通过hash和服务器公钥进行解密,得到的两部分如果相等,那么这次传输的内容就没问题。可以愉快地进行通信啦~
看明白了是不是会问为啥要进行hash在加密啊,直接加密不就好了吗?答案很简单啊,因为效率。
优化
- tcp三次握手可以利用'会话缓存'来节省一次握手时间,其实就是缓存,和咱们平常写代码没差,就是写法不一样。我们平常用到的很多技术很多也是一些基本的技术,举一反三就好。
- 和上面差不多。tcp第二次握手的时候就可以发数据了,可以在这上面做手脚
- 尽量减少rsa算法,实在是慢,这个想办法缓存或者算法优化吧,我也不太懂~
- 证书优化,怎么便宜怎么来呗,薅!!!不过也得看企业/个人怎么取舍了
- 等~ 不做深入了
总结
本文内容是理解后经过处理展示出来的,不理解的也不会乱写,如果仍有问题欢迎指出,我会及时回复的。
了解这几点,对于http基础会有一个整体的理解,不管是工作中还是求职中都能说出个一二三来,或许还应该写一点常见问题,但是微乎其微,等用到了自然而然就知道了。
马上清明节了吧,祝大家清明节快乐!!哈哈哈哈~
部分图片来源自网络,侵删
被问到到http的时候你就这么回答!的更多相关文章
- 在面试官问你BS和CS区别的时候如何回答??
这是我下来整理好的,如果哪里不全,望大家多多指教 C/S是Client/Server的缩写.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Inform ...
- Python--day33--当面试时候问到如何解决黏包问题?的回答。
- 那些面试官必问的JAVA多线程和并发面试题及回答
Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环 ...
- 去年去阿里面试,面试官居然问我Java类和对象,我是这样回答的!
1.谈谈你对Java面向对象的理解? 面向对象就是把构成问题的事务分解成一个个对象,建立对象的目的不是一个步骤,而是为了描述一个事务在解决问题中的行为.类是面向对象的一个重要概念,类是很多个具有相同属 ...
- 面试官问Linux下如何编译C程序,如何回答?为你编译演示
文章来源:嵌入式大杂烩 作者:ZhengNL Windows下常用IDE来编译,Linux下直接使用gcc来编译,编译过程是Linux嵌入式编程的基础,也是嵌入式高频基础面试问题. 一.命令行编译及各 ...
- 最近找java实习面试被问到的东西总结(Java方向)
时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...
- Java面试常问的问题(转载)
并发.JVM.分布式.TCP/IP协议 1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的.以下简单模拟一个数据结构的连环炮. ...
- 求你了,再问你Java内存模型的时候别再给我讲堆栈方法区了…
GitHub 4.1k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.1k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.1k Star 的 ...
- 求求你,下次面试别再问我什么是 Spring AOP 和代理了!
https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9403056301388627935% ...
随机推荐
- elasicsearch数据自动清理脚本
elasticsearch随着保存的数据越来越多,磁盘占用越来越大,有必要进行定期自动清理. 直接上脚本 cat es-index-clear.sh #/bin/bash #查看索引信息 #curl ...
- 我的学习归纳方法(以学习Maven为例)
以我的个人角度来看待学习这件长久的事,希望对你有帮助,也希望你能提一下你的意见 本文初衷 把自己模板化 以此篇为引,与同行沟通心得,所以在此严重要求如果你有对应的心得还请能回复下,真心感谢!(鞠躬) ...
- 恭喜你,Get到一份 正则表达式 食用指南
先赞后看,养成习惯 前言 正则表达式 正则表达式: 定义一个搜索模式的字符串. 正则表达式可以用于搜索.编辑和操作文本. 正则对文本的分析或修改过程为:首先正则表达式应用的是文本字符串(text/st ...
- C++走向远洋——54(项目一2、分数类的重载、取倒数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- LeetCode 81.Search in Rotated Sorted Array II(M)
题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...
- mongoose-面向对象操作mongodb的Nodejs框架
介绍 无论是mysql还是mongodb,传统的与数据库交互的方式都是按照他们提供的API来写代码.它们提供的API往往不是很容易理解,而且难以记忆,如果传错了参数,写错一个符号都要查文档. ORM( ...
- jinja2的url_for 和数据块
1.静态文件引入:{{ url_for('static', filename='文件路径') }} 2.定义路由:{{ url_for('模块名.视图名',变量=参数) }} 3.定义数据块: ...
- 微信小程序接入百度OCR(身份证识别)
微信小程序接入百度OCR(身份证识别) 1.接口描述 支持对二代居民身份证正反面所有8个字段进行结构化识别,包括姓名.性别.民族.出生日期.住址.身份证号.签发机关.有效期限,识别准确率超过99%:同 ...
- 峰哥说技术:04-Spring Boot基本配置
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 04 Spring Boot基本配置 1)容器的相关配置 在Spring Boot中可以内置Tomcat. ...
- JVM02——JVM运行时内存
在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存.关注我的公众号「Java面典」了解更多 Java 相关知识点. Java 堆从 GC 的 ...