计算机网络知识点(六)

目录

一、简述TCP的keep-alive以及和HTTP的keep-alive的区别

[1、HTTP keep-alive](#1、HTTP keep-alive)

[2、TCP keep-alive](#2、TCP keep-alive)

二、简述TCP协议的延迟ACK和累计应答

1、延迟应答

2、累计应答

三、简述TCP如何加速大文件的传输

1、建连优化

2、平滑发包

3、丢包预判

[4、RTO 探测](#4、RTO 探测)

5、带宽评估

6、带宽争抢

四、服务器如何判断客户端断开连接

五、简述端到端、点到点的区别

1、端到端

2、点到点


一、简述TCP的keep-alive以及和HTTP的keep-alive的区别

1、HTTP keep-alive

在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要。

2、TCP keep-alive

链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。

TCP的keep-alive机制和HTTP的keep-alive机制是说的完全不同的两个东西,tcp的keep-alive是在ESTABLISH状态的时候,双方如何检测连接的可用行;而http的keep-alive说的是如何避免进行重复的TCP三次握手和四次挥手的环节。

二、简述TCP协议的延迟ACK和累计应答

1、延迟应答

指的是TCP在接收到对端的报文后,并不会立即发送ack,而是等待一段时间发送ack, 以便将ack和要发送的数据一块发送。当然ack不能无限延长,否则对端会认为包超时而造成报文重 传。linux采用动态调节算法来确定延时的时间。

2、累计应答

指的是为了保证顺序性 ,每一个包都有一个ID (序号),在建立连接的时候,会商定起始的ID是多少,然后按照ID一个个发送。而为了保证不丢包,对应发送的包都要进行应答,但不是一个个应答,而是会应答某个之前的ID,该模式称为累计应答。

三、简述TCP如何加速大文件的传输

1、建连优化

TCP 在建立连接时,如果丢包,会进入重试,重试时间是 1s、2s、4s、8s 的指数递增间隔,缩短定时器可以让 TCP 在丢包环境建连时间更快,非常适用于高并发短连接的业务场景。

2、平滑发包

在 RTT 内均匀发包,规避微分时间内的流量突发,尽量避免瞬间拥塞。

3、丢包预判

有些网络的丢包是有规律性的,例如每隔一段时间出现一次丢包,例如每次丢包都连续丢几个等,如果程序能自动发现这个规律(有些不明显),就可以针对性提前多发数据,减少重传时间,提高有效发包率。

4、RTO 探测

若始终收不到 ACK 报文,则需要触发 RTO 定时器。RTO 定时器一般都时间非常长,会浪费很多等待时间,而且一旦 RTO,CWND 就会骤降(标准 TCP),因此利用 Probe 提前与 RTO 去试探,可以规避由于 ACK 报文丢失而导致的速度下降问题。

5、带宽评估

通过单位时间内收到的 ACK 或 SACK 信息可以得知客户端有效接收速率,通过这个速率可以更合理的控制发包速度。

6、带宽争抢

有些场景(例如合租)是大家互相挤占带宽的,假如你和室友各 1Mbps 的速度看电影,会把 2Mbps 出口占满,而如果一共有 3 个人看,则每人只能分到 1/3。若此时你的流量流量达到 2Mbps,而他俩还都是 1Mbps,则你至少仍可以分到 2/(2+1+1) * 2Mbps = 1Mbps 的 50% 的带宽,甚至更多,代价就是服务器侧的出口流量加大,增加成本(TCP 优化的本质就是用带宽换用户体验感)。

四、服务器如何判断客户端断开连接

  1. 检测连接是否丢失的方法大致有两种:keep-aliveheart-beat

  2. (tcp内部机制)采用keep-alive,它会先要求此连接一定时间没有活动(一般是几个小时),然后发出数据段,经过多次尝试后(每次尝试之间也有时间间隔),如果仍没有响应,则判断连接中断。可想而知,整个周期需要很长的时间。

  3. (应用层实现)一个简单的heart-beat实现一般测试连接是否中断采用的时间间隔都比较短,可以很快的决定连接是否中断。并且,由于是在应用层实现,因为可以自行决定当判断连接中断后应该采取的行为,而keep-alive在判断连接失败后只会将连接丢弃。

五、简述端到端、点到点的区别

1、端到端

端到端通信是针对传输层来说的,传输层为网络中的主机提供端到端的通信。因为无论TCP还是UDP协议,都要负责把上层交付的数据从发送端传输到接收端,不论其中间跨越多少节点。只不过TCP比较可靠而UDP不可靠而已。所以称之为端到端,也就是从发送端到接收端。

它是一个网络连接,指的是在数据传输之前,在发送端与接收端之间(忽略中间有多少设备)为数据的传输建立一条链路,链路建立以后,发送端就可以发送数据,直到数据发送完毕,接收端确认接收成功。也就是说在数据传输之前,先为数据的传输开辟一条通道,然后再进行传输。从发送端发出数据到接收端接收完毕,结束。

端到端通信建立在点到点通信的基础之上,它是由一段段的点到点通信信道构成的,是比点到点通信更高一级的通信方式,完成应用程序(进程)之间的通信。

优点:链路建立之后,发送端知道接收端一定能收到,而且经过中间交换设备时不需要进行存储转发,因此传输延迟小。

缺点:(1)直到接收端收到数据为止,发送端的设备一直要参与传输。如果整个传输的延迟很长,那么对发送端的设备造成很大的浪费。(2)如果接收设备关机或故障,那么端到端传输不可能实现。

2、点到点

点到点通信是针对数据链路层或网络层来说的,因为数据链路层只负责直接相连的两个节点之间的通信,一个节点的数据链路层接受ip层数据并封装之后,就把数据帧从链路上发送到与其相邻的下一个节点。 点对点是基于MAC地址和或者IP地址,是指一个设备发数据给与该这边直接连接的其他设备,这台设备又在合适的时候将数据传递给与它相连的下一个设备,通过一台一台直接相连的设备把数据传递到接收端。

直接相连的节点对等实体的通信叫点到点通信。它只提供一台机器到另一台机器之间的通信,不会涉及到程序或进程的概念。同时点到点通信并不能保证数据传输的可靠性,也不能说明源主机与目的主机之间是哪两个进程在通信。由物理层、数据链路层和网络层组成的通信子网为网络环境中的主机提供点到点的服务。

优点:(1)发送端设备送出数据后,它的任务已经完成,不需要参与整个传输过程,这样不会浪费发送端设备的资源。(2)即使接收端设备关机或故障,点到点传输也可以采用存储转发技术进行缓冲。

缺点:发送端发出数据后,不知道接收端能否收到或何时能收到数据。

在一个网络系统的不同分层中,可能用到端到端传输,也可能用到点到点传输。如Internet网,IP 及以下各层采用点到点传输,4层以上采用端到端传输。

相关推荐
Lee川14 小时前
优雅进化的JavaScript:从ES6+新特性看现代前端开发范式
javascript·面试
Lee川17 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i19 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有20 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有20 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫21 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫21 小时前
Handler基本概念
面试
Wect21 小时前
浏览器缓存机制
前端·面试·浏览器
掘金安东尼1 天前
Fun with TypeScript Generics:玩转 TS 泛型
前端·javascript·面试
掘金安东尼1 天前
Next.js 企业级落地
前端·javascript·面试