1、讲一下三次握手和四次挥手
1.1、三次握手
- 客户端告诉服务端我要连接你,你能收到我吗?
- 服务端告诉 客户端,我能收到你,你来连吧
- 客户端告诉服务端,好,我来了.
1.2、四次挥手
- 客户端告诉服务端,我要和你分手
- 服务端收到告诉客户端,我知道了
- 服务端觉得不解气,于是又告诉客户端,分就分,我也要和你分
- 客户端收到之后说,我直到了,分吧。
1.3、为什么要四次分手
- 因为TCP是全双工,所以双方都确认关闭请求,特殊情况下可以把第二次和第三次合并。但中间如果有没发完的数据 就不能合并,服务器先发送我知道你要分手了。服务器把剩下的数据发完之后,服务器在发送关闭请求。
- 之所以要客户端收到ACK M+1之后不直接关闭是因为要等待,服务端法FIN N。如果客户端立马关闭了,来个新程序拿个这个端口,不就乱来了。
2、讲讲TCP与UDP的区别
- TCP UDP HTTP IP都是TCP/IP协议族,因为TCP和IP很重要就拿他们两命名了。
- 它们都在传输层.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堆上。