Android知识点总结(七):网络编程

48 阅读9分钟

1、讲一下三次握手和四次挥手

1.1、三次握手

image.png

  • 客户端告诉服务端我要连接你,你能收到我吗?
  • 服务端告诉 客户端,我能收到你,你来连吧
  • 客户端告诉服务端,好,我来了.

1.2、四次挥手

  • 客户端告诉服务端,我要和你分手
  • 服务端收到告诉客户端,我知道了
  • 服务端觉得不解气,于是又告诉客户端,分就分,我也要和你分
  • 客户端收到之后说,我直到了,分吧。

1.3、为什么要四次分手

image.png

  • 因为TCP是全双工,所以双方都确认关闭请求,特殊情况下可以把第二次和第三次合并。但中间如果有没发完的数据 就不能合并,服务器先发送我知道你要分手了。服务器把剩下的数据发完之后,服务器在发送关闭请求。
  • 之所以要客户端收到ACK M+1之后不直接关闭是因为要等待,服务端法FIN N。如果客户端立马关闭了,来个新程序拿个这个端口,不就乱来了。

2、讲讲TCP与UDP的区别

  • TCP UDP HTTP IP都是TCP/IP协议族,因为TCP和IP很重要就拿他们两命名了。 image.png
  • 它们都在传输层.TCP可靠、udp不可靠。但对实时性要求高的地方UDP更好用给,比如直播、游戏。对准确性要求高、速度慢能 接收,可以用TCP
  • 传输方式:面向报文就是不管这个报文在数据前后的关系,面向字节流则 关注报文在数据前后 的关系。
  • 长度那里UDP报文更小所以更快。- 只有8字节(TCP有20字节)。2字节源端口,2字节目的端口,2字节长度,2字节校验

3、谈谈TCP流量控制 与 拥塞控制

3.1、举例

  • 举个摊煎饼果子的例子。
  • 流量控制:我这个锅只能放50g的面糊。一次放太多煮不熟,这和接收端的缓存有关。
  • 拥塞控制:摊煎饼一秒倒5g面糊,我才忙得过来,倒太快了摊煎不匀,倒面糊不小心倒到地上,我立马重新倒,这就是拥塞控制中的快速重传

3.2 流量控制-滑动窗口

  • TCP头有个window字段,表示接收端告诉发送端,你这次发多少数据不要超过多少比较合适。
  • 假设我们窗口为20。发送方发送32-51的序列包。接收端响应ack = 36,那么意味着只收到了32-35的包。如果接收端响应头窗口大小仍然为20,那么发送端就发36-55的包 。

3.3 流量控制-零窗口

  • 当响应数据的窗口值是0,那么发送端就停止发送报文.有个计时器,当 发送端收到窗口为0,就 停止发送报文,并开启定时器,每隔一段时间 就发个 测试报文去问接收端,打听是否可以继续发数据了,如果可以,接收方就告诉发送方窗口大小和ack。如果窗口还是0,就发送方刷新启动定时器。

3.4 拥塞控制-慢启动

  • 慢启动算法为TCP发送方新增一个拥塞窗口。对应倒流量控制。发送方根据拥塞窗口 和滑动窗口的最小值作为发送上限。
  • cwnd拥塞窗口初始值比较哦啊小,RFC建议为2-4个MSS。(tcp一次传输发送 的最大数据段长度)
  • 假设初cwnd为1个MSS。发送端开始按照拥塞窗口大小发送数据,如果被ACK(被确认 ),下次就发送2个。再下次4个 。指数增长。只是起点低而已。增长快得很。

3.5 拥塞控制-拥塞避免

  • 当cwnd值达到慢启动门限ssthresh,就不指数增长而是+1了。拥塞控制算法从慢启动阶段转变为拥塞避免阶段。

3.6 拥塞控制-快重传与快恢复

  • 超时重传:发送端一直收不到响应端的ACK报文,发送的时候有个计时器,超时没收到就重发直到成功,这就是超时重传。(重传次数看系统设置,一般是3次)
  • 当发送端发送M1\M2\M3\M4\M5\M6的时候,假设收到M4了都没有收到M3,那么接收端会响应一次M2的ACK。接到M5还是没有M3,那么接收端会响应一次M2的ACK。如果请求段接收倒了3次M2的ACK。那么及时M3没有 超时响应,依旧会进行认为M3丢了。然后重传,这就是快速重传。
  • 同事启动快速恢复,把ssthresh设置为CWND的一般,再把CWND设置为SSTHRESH的值加3.、重传M3。防止是因为拥塞问题导致的上传失败。再收到重复的ACK时,cwnd加一。当 收到新数据包的ACK时(M6),cwnd设置为第一步中的ssthresh的值(该恢复过程结束,可以回到恢复之前的拥塞避免状态)

4、谈谈你的http和https关系的理解

  • 在HTTPS中,客户端会向服务器发送一个SSL/TLS握手请求。在这个过程中,客户端会验证服务器的SSL/TLS证书是否合法。这是通过使用CA证书来完成的。

如果客户端验证了SSL/TLS证书是合法的,它会生成一个随机的值AAB,并使用服务器的公钥加密这个值,生成对话密钥AAC。然后,客户端将对话密钥AAC发送给服务器。

服务器收到对话密钥AAC后,使用其私钥解密,得到原始的随机值AAB。然后,服务器和客户端就可以使用这个随机值AAB进行对称加密和解密,以保护通信数据的安全性。

因此,HTTPS通过SSL/TLS和CA证书的结合,实现了数据的安全传输和身份验证。这种机制确保了只有合法的服务器才能与客户端建立安全连接,并保护了通信数据的安全性。

  • 由于ssl握手要9个包,加上http的3个 包。https要12个包 ,明显更慢
  • http用的80端口 https用的443端口。https就是构建在SSL/TLS上的HTTP协议。所以更耗资源更慢。

https 解决监听、冒充、篡改。

  • 当然,还是有局限性的,客户端就不可靠。中间人攻击,没点办法。比如我在手机上装个假证书,然后就能通过charles爬数据,从而解析请求了,监听完成。
  • 同理,我拿到对话密钥就可以进行冒充和篡改了。如果是每次请求都是非堆成加密,那我只要拿到公钥就可以篡改了。监听的话,其实客户端都不安全,不从网络入手,从客户端入手。

5、SLL过程经历了什么

在HTTPS中,客户端会向服务器发送一个SSL/TLS握手请求。在这个过程中,客户端会验证服务器的SSL/TLS证书是否合法。这是通过使用CA证书来完成的。

如果客户端验证了SSL/TLS证书是合法的,它会生成一个随机的值AAB,并使用服务器的公钥加密这个值,生成对话密钥AAC。然后,客户端将对话密钥AAC发送给服务器。

服务器收到对话密钥AAC后,使用其私钥解密,得到原始的随机值AAB。然后,服务器和客户端就可以使用这个随机值AAB进行对称加密和解密,以保护通信数据的安全性。

因此,HTTPS通过SSL/TLS和CA证书的结合,实现了数据的安全传输和身份验证。这种机制确保了只有合法的服务器才能与客户端建立安全连接,并保护了通信数据的安全性。

6、get和post请求区别的立即

  • 缓存角度
    • get会被缓存,post不会
    • get因为缓存所以能被收藏
    • get因为缓存回退是读缓存,而post是重新加载
    • get能被收藏,post不行
  • 参数编码角度
    • get有长度限制,几千字符。post无限制
    • get支持url编码,post支持多重
    • get支持ASCII字符参数,post没有限制
    • GET通过URL传参,post通过requestBody
    • GET参数明文不安全,post相对安全。
  • TCP角度
    • 本质上没区别,http本质上是TCP/IP。get post底层都一样。给get加上requetsbody post url上代参数也行得通。区别在于http的规定和浏览器服务器的限制。

7、输入一串URL到浏览器都经历过什么

  • url去问本地有没有没过期的IP缓存,如果没有就去问域名服务器解析IP,得到ip之后返回给客户端并缓存,然后通过ip去请求服务器。准确来说服务器域名解析那里有DNS根服务器、.COM域名服务器和专门管这个域名的服务器。按照顺序去问的。
  • TCP连接,ssl握手
  • 发送HTTP/HTTPS请求
  • Server处理HTTP请求并返回HTTP报文
  • 浏览器解析并渲染页面
  • HTTP连接断开

8、断点续传的原理(腾讯)

  • 利用了http请求的Range字段,请求服务器的一个文件是,通过请求头中设置range:byte=x-
  • range表示文件返回的摁键字节数据从第x字节开始,指定需要传输的文件范围。
  • 那么对文件端传输的文件数据进行保存。java接用gRandomAccessFile的seek方法访问记录并从该指定位置开始写。

9、如何保证下载文件的完整性?

  • 返回的下载信息中包含文件md5。下载完之后md5一下文件看能不能和返回信息的md5堆上。