2020-08-29---TCP,UDP,HTTP,HTTPS

面试之通用网络篇

本章 , 来简单的描述一下经常问到的 tcp , udp , http , https 等内容

关于 http 和 https 的介绍 , 推荐阅读 : https://blog.csdn.net/xiaoming100001/article/details/81109617

本章偏向于归纳总结… 描述一些常见的问题. 比较粗略. 一切为了面试


常见问题
  1. TCP 和 UDP 的 异同点

    对于这种问题… 先提出一些最明显的区别

    • TCP是面向连接的, UD是不面向连接的
    • 因此 TCP 具有可靠传输(通过3次握手, 4次挥手… 滑动窗口… 拥塞控制.之类的手段) , UDP仅仅是尽可能的传输
    • TCP 提供的字节流的数据… UDP 使用的数据报
    • 他们的报头不同. TCP更加复杂, UDP的就简单很多了(但是UDP 最长就64KB , 如果大于这个长度, 就需要应用层面自己进行编号分包处理了 )
    • 共同点的话… 就是他们都是传输层的协议
  2. 描述一下TCP的3次握手, 和4次挥手

    先描述全貌

    3次握手

    3次握手, 由客户端发起第一次握手(seq = x . SYN) , 服务器收到这条请求 ( 第一次握手 , 服务器确定了自己接收信息的能力 是没问题的)

    第二次握手, 由服务器发送 , 是一个包含了(SYN , ACK , seq = y , ack = x+1) 回应客户端, 可以进行建立连接 (第二次握手, 客户端会收到这条请求… 客户端确定了 , 自己的发送能力, 和接收能力)

    第三次握手, 由客户端发起 , 是一个包含了 (ACK, seq = x+1 , ack = y+1) 回应服务器, 确定建立连接 (第三次握手, 服务器 确定了自己发送信息的能力也是没有问题的 )

    注 : 括号里的 原因, 我觉得 也可以用来解释 为什么 TCP 需要3次握手… 不是2次…或者其他的…

    3次握手中的状态变化

    第一次握手 , 客户端发送了请求之后, 进入SYN-SEND (请求发送的状态) , 服务器收到之后, 结束了 LISTEN (接收状态) 状态

    第二次握手, 服务器发送请求之后, 进入 SYN-RCVD (请求应答状态) , 客户端收到之后 , 结束 SYN-SEND 状态

    第三次握手 , 客户端发送请求好, 进入了 ESTAB-LISHED (已建立连接状态) , 服务器收到之后… 也会进入 建立连接状态. 连接完成

    4次挥手

    第一次挥手, 也是由客户端率先发起 (FIN , seq = x)

    第二次挥手, 服务器收到之后, 也会发出一个 确认收到的包 (ACK = 1 , seq = y , ack = x +1)

    第三次挥手 , 还是由服务器发起 , 当 服务器认为发送完了所有应该发送的数据之后! , 会向客户端发起 真正断开连接的请求 (FIN = 1 , ACK = 1 , seq = w , ack = x + 1)

    第四次挥手 , 客户端知道了要断开连接了 , 回应服务器我已经断开连接了 ( ACK = 1 , seq = x + 1 , ack = w+1) . 服务器收到这条之后, 就进入 close 了, 关闭了

    但是 ! 第四次挥手之后, 客户端为了确保 服务器收到这条消息, 不会立马断开连接 , 需要等待一个 2MSL (也就是信息一来一回最长时间) , 如果还是没有发送信息过来, 那么就关闭连接

    4次握手状态的变化

    第一次 客户端挥手 , 客户端进入 fin-wait-1 (终止1状态)

    第二次 服务端挥手, 服务端结束了 稳定连接状态, 进入 close-wait (关闭等待状态) : 这个状态问的比较多 ,客户端接收到这次挥手之后, 进入 fin-wait-2 (终止2状态)

    第三次 服务端挥手, 进入 last-ack (最后确认) 状态

    第四次 , 客户端挥手, 进入 time-wait (等待时间的状态, 也就是2msl 的时间) , 之后就变成 close了 , 服务端收到消息 就变成 close了

    额外

    可以使用命令 netstat , 对端口进行状态排查

    netstat命令各个参数说明如下:

    -t : 指明显示TCP端口

    -u : 指明显示UDP端口

    -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)

    -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序。

    -n : 不进行DNS轮询,显示IP(可以加速操作)

    netstat -ntlp //查看当前所有tcp端口·

    netstat -ntulp |grep 80 //查看所有80端口使用情况·

    netstat -an | grep 3306 //查看所有3306端口使用情况

  3. tcp中, 拥塞控制 和 流量控制的区别

    流量控制是端到端的控制,例如A通过网络给B发数据,A发送的太快导致B没法接收(B缓冲窗口过小或者处理过慢),这时候的控制就是流量控制,原理是通过滑动窗口的大小改变来实现。

    拥塞控制是A与B之间的网络发生堵塞导致传输过慢或者丢包,来不及传输。防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至于过载。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络性能有关的所有因素。

    建议阅读 : https://blog.csdn.net/ailunlee/article/details/53716367


额外总结

对称加密和非对称加密 :

  • 对于密码学中, 这是2种加密方式
  • 对于对称加密而言 , 它的工作流程是 , 明文—>通过秘钥—>密文----->通过秘钥---->明文
  • 而非对称加密 , 则是有一个准备工作先. 先做出一个 私钥 —> 推导得出 公钥 , 然后有意思的开始了, 明文—>使用私钥加密—>密文—>只能使用公钥解密—>明文 . 反过来也一样, 明文---->使用公钥加密---->密文—>只能使用私钥解密----> 明文
  • 对于对称加密而言, 非对称加密有个很重要的好处, 私钥基本不会泄露, 在泄露 公钥的情况下, 第三者 无法伪造 信息 .(因为我虽然知道公钥, 也就是服务器发出的信息 我能解密得到… 但是无法伪造一条信息发送给客户端 , 客户端发送出来的信息 无法解读…)
    • 当然并不是绝对安全的… 如果 第三者自己做出一对公钥私钥… 加入到客户端和服务端中间… 偷梁换柱 , 还是能做到双方监听的

https相关 :

  • http默认使用80端口, https 默认使用 443 端口 , https 基于http协议, 通过ssl或tls提供加密数据, 验证对方身份以及数据完整性

  • 它具有很多http不具有的特点

    • 内容加密:采用混合加密技术,中间者无法直接查看明文内容
    • 验证身份:通过证书认证客户端访问的是自己的服务器
    • 保护数据完整性:防止传输的内容被中间人冒充或者篡改
  • https 采用 混合加密手段 对称加密和非对称加密都用上了 具体参考下方

  • https建立连接

    1. client向server发送请求,然后连接到server的443端口,发送的信息主要是随机值1和客户端支持的加密算法。
    2. server接收到信息之后给予client响应握手信息,包括随机值2和匹配好的协商加密算法,这个加密算法一定是client发送给server加密算法的子集
    3. 随即server给client发送第二个响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容
    4. 客户端解析证书,这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值(预主秘钥)
    5. 客户端认证证书通过之后,接下来是通过随机值1、随机值2和预主秘钥组装会话秘钥。然后通过证书的公钥加密会话秘钥
    6. 传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到随机值1、随机值2和预主秘钥
    7. 服务端解密得到随机值1、随机值2和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同
    8. 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息
    9. 同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明SSL层连接建立完成了。

    大体上分为…

    client 和 server 各自提供一个随机数. 并且商讨好 使用哪种加密手段

    server给client 一个ca的证书, 这个证书里面 包含了一个 公钥 (这里使用了非对称的加密手段) (这个证书无法被伪造 , 所以能够确保安全)

    客户端通过 组合 这些随机数. 变成一个 会话秘钥… 把这个秘钥 使用 公钥进行加密 (这样 就算被中间方拦截了 也因为没有秘钥无法解析) 服务端收到 会话秘钥之后, 使用私钥进行解析, 通过 对称加密, 得到组成的 随机值 , 也对这些随机值进行组合, 得到一个会话秘钥 ,

    双方使用会话秘钥进行交流一下… 没有问题 就表明建立成功…


结束

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值