计算机网络
tcp和udp的区别?
- tcp是面向连接的,udp是无连接的。
- tcp是可靠的,udp是尽最大努力的。
- tcp是面向字节流的,udp是面向报文的。
- tcp对系统资源的要求较多,udp对系统的要求较少。
- tcp有流量控制和拥塞控制,udp没有。
- tcp是点到点的,而udp可以一对一、一对多。多对多。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节。
网络层与传输层的区别
一个点到点,主机之间的通信。
网络层只是根据网络地址将源结点发出的数据包传送到目的结点(点到点),其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
另外一个是端到端,主机应用程序进程之间的通信。
而传输层则负责将数据可靠地传送到相应的端口(端到端),传输层提供了主机应用程序进程之间的端到端的服务。传输层利用网络层提供的服务,并通过传输层地址提供给高层用户传输数据的通信端口,使高层用户看到的只是在两个传输实体间的一条端到端的、可由用户控制和设定的、可靠的数据通路。
为什么TCP要有三次握手?而不是2次和4次?
TCP连接是可靠连接,要保证数据包可靠传输到对方。这个是通过序列号来实现的。
A给B发送数据时,初始序列号生成器会生成一个新的32位的ISN,这个时钟大概4微秒增长一次。所以大概4.5小时是一个周期,而一个包在网络中的寿命大概是两分钟。所以,我们可以这个机器发出的ISN是唯一的,因为如果是在经过了一个周期又发出了一个相同的,那么在后一个发出的时候,前一个已经结束了。
三次握手是必须的,是因为序列号没有绑定到全局时钟(也不太现实),接收方接收到第一个 SYN 时,没有办法知道这个 SYN 是是否延迟了很久了,所以,接收方一定需要跟发送方确认 SYN,也就是ACK。
TCP是全双工通信,所以,A给B发送了SYN信号,B需要回ACK表示确认,同时B也要给A发SYN,A也要给B回ACK确认。但是B发的ACK和SYN可以合并为一条,故可以“三次握手”。
- A –> B SYN my sequence number is X
- A <– B ACK your sequence number is X
- A <-- b syn my sequence number is y 4) a --> B ACK your sequence number is Y
2与3都是 B 发送给 A,因此可以合并在一起,因此成为three way (or three message) handshake(其实翻译为三步握手,或者是三次通信握手更为准确)
操作系统
物理地址和逻辑地址的区别?
逻辑地址(LogicalAddress)是指由程序产生的与段相关的偏移地址部分。有时我们也把逻辑地址称为虚拟地址
物理地址(Physical Address) 是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。
C++知识点
指针和引用的区别?一般答前四点就好了,答太多人家会觉得你背的。
- 指针是一个对象,是存放地址的对象。引用只是一个变量的别名。
- 指针可以不初始化,或者初始化为NULL。但是引用在声明的时候必须初始化。
- 在不被const修饰的情况下指针可以修改它指向的对象,而引用一旦绑定了某个变量就不能修改了。
- 用sizeof看指针显示是操作系统里指针的大小,32位是4字节,64位是8字节。而用sizeof看引用,这是引用所绑定的变量的大小。
C++多态是怎么实现的?
请参考C++多态的实现原理 - 略懂一点剑术的文章 - 知乎
https://zhuanlan.zhihu.com/p/65410057
口述
如果一个类有虚函数的话,那就会给这个类开辟一个虚函数表,并且有一个指针指向这个表。虚函数表是由函数指针组成的数组,表里面有这个类的所有虚函数的地址。注意,虚函数表是一个类一个,而不是一个对象一个
当子类继承父类时,就会把这个表也继承过来。如果子类里重新定义了父类的虚函数,那么在子类的虚表里,这个被重新定义的函数对应的地址就会改成重新定义之后的函数地址。如果没有重新定义,那就还是原来的地址。如果子类又定义了新的虚函数,也会被加到虚函数表里。
算法
如何判断完全二叉树?
层序遍历,并且不管左右儿子是不是空都给放到队列里。如果当前元素为空则跳出循环。跳出循环之后,看队列里还有没有非空元素,如果有,则不是完全二叉树。没有的话说说明是完全二叉树。
给一棵树,求树上任意两点的最长距离。(树的直径)
两边BFS/DFS,第一次任意选一个点A,进行BFS,找到离这个点最远的点B。再以B为起点进行BFS,找到最远点C,BC就是最远距离。(证明自行百度)
网友评论