一个月前呢,为了巩固下自己的基础以及为以后的面试做准备,每天去找一些大厂的面试真题,然后解答下,然后自己确实也在这个过程中能复习到不少以前没有重视的问题,今天就总结下之前一个多月总结的面试题,难度不大,大佬可以直接路过,当然发发善心点个赞也是可以的❤️。
进入正题,下面为主要内容,每三个问题为一个小节,也就是一个专题文章,我就不具体区分了,由于字数问题,也只节选了一些问题,大家见谅。另外答的不好的地方大家也可以留言敲敲我,感谢。
1)过程分析:主要分为三步
2)其中涉及到TCP/IP协议簇,包括DNS,TCP,IP,HTTP协议等等。
TCP/IP一般指的是TCP/IP协议簇,主要包括了多个不同网络间实现信息传输涉及到的各种协议 主要包括以下几层:
客户端简称A,服务器端简称B
1)TCP建立连接需要三次握手
2)TCP断开连接需要四次挥手
3)为什么挥手多一次 其实正常的断开和连接都是需要四次:
但是连接中,第二步和第三步是可以合并的,因为连接之前A和B是无联系的,所以没有其他情况需要处理。而断开的话,因为之前两端是正常连接状态,所以第二步的时候不能保证B之前的消息已经发送完毕,所以不能马上告诉A要断开的消息。这就是连接为什么可以少一步的原因。
4)为什么连接需要三次,而不是两次。正常来说,我给你发消息,你告诉我能收到,不就代表我们之前通信是正常的吗?
TCP 协议为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重发。
TCP是怎么保证可靠传输的?
所以握手过程中,比如A发送syn信号给B,初始序列号为120,那么B收到消息,回复ack消息,序列号为120+1。同时B发送syn信号给A,初始序列号为256,如果收不到A的回复消息,就会重发,否则丢失这个序列号,就无法正常完成后面的通信了。
这就是三次握手的原因。
TCP提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接(三次握手),之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP 是一个简单的面向数据报的运输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,但是不能保证它们能到达目的地。由于UDP在传输数据报前不用再客户和服务器之间建立一个连接,且没有超时重发等机制,所以传输速度很快。
所以总结下来就是:
可以看到TCP适用于稳定的应用场景,他会保证数据的正确性和顺序,所以一般的浏览网页,接口访问都使用的是TCP传输,所以才会有三次握手保证连接的稳定性。而UDP是一种结构简单的协议,不会考虑丢包啊,建立连接等。优点在于数据传输很快,所以适用于直播,游戏等场景。
常见的有四种:
1)请求报文:
//请求行(包括method、path、HTTP版本)
GET /s HTTP/1.1
//Headers
Host: www.baidu.com
Content-Type: text/plain
//Body
搜索****
2)响应报文
//状态行 (包括HTTP版本、状态码,状态信息)
HTTP/1.1 200 OK
//Headers
Content-Type: application/json; charset=utf-8
//Body
[{"info":"xixi"}]
3)常用状态码
主要分为五种类型:
1)对称加密,即加密和解密算法不同,但是密钥相同。比如DES,AES算法。
数据A --> 算法D(密钥S)--> 加密数据B
加密数据B --> 算法E(密钥S)--> 数据A
优点:缺点:密钥有可能被破解,容易被伪造。传输过程中一旦密钥被其他人获知则可以进行数据解密。
2)非对称加密,即加密和解密算法相同,但是密钥不同。私钥自己保存,公钥提供给对方。比如RSA,DSA算法。
数据A --> 算法D(公钥)--> 加密数据B
加密数据B --> 算法D(私钥)--> 数据A
优点:安全,公钥即使被其他人获知,也无法解密数据。缺点:需要通信双方都有一套公钥和私钥
1)首先,为什么需要数字签名?防止被攻击,被伪造。由于公钥是公开的,别人截获到公钥就能伪造数据进行传输,所以我们需要验证数据的来源。
2)怎么签名?由于公钥能解密 私钥加密的数据,所以私钥也能解密 公钥加密的数据。(上图非对称加密A和B代号互换即可) 所以我们用公钥进行加密后,再用私钥进行一次加密,那么私钥的这次加密就叫签名,也就是只有我自己可以进行加密的操作。所以传输数据流程就变成了加密数据和签名数据,如果解出来都是同样的数据,那么则数据安全可靠。
数据A --> 算法D(公钥)--> 加密数据B
数据A --> 算法D(私钥)--> 签名数据C
加密数据B --> 算法D(私钥)--> 数据A
签名数据C --> 算法D(公钥)--> 数据A
Base64是一种将二进制数据转换成64种字符组成的字符串的编码算法,主要用于非文本数据的传输,比如图片。可以将图片这种二进制数据转换成具体的字符串,进行保存和传输。
严格来说,不算。虽然它确实把一段二进制数据转换成另外一段数据,但是他的加密和解密是公开的,也就无秘密可言了。所以我更倾向于认为它是一种编码,每个人都可以用base64对二进制数据进行编码和解码。
面试加分项:为了减少混淆,方便复制,减少数据长度,就