TCP协议不会自动检测连接是否断开
TCP | UDP | |
---|---|---|
连接方式 | 面向连接的、可靠的数据流传输 | 非面向连接的、不可靠的数据流传输 |
通信方式 | 一对一、点对点 | 一对一、一对多、多对一、多对多 |
传输单位 | TCP报文段 | 用户数据报 |
对系统资源要求 | 较多(TCP的20个字节信息包),负载高,采用虚电路 | 较少(UDP信息包的标题很短,只有8个字节) |
安全性 | 可靠,安全 | 数据传输快,但是不可靠(尽最大努力交付) |
对应协议 | FTP、Telnet、SMTP、POP3、HTTP | DNS、SNMP、TFTP |
TCP提供超时重发、丢弃重复数据、检验数据、窗口技术、流量控制等功能,保证数据能传到另外一端。
UDP常用于QQ等即时通讯软件(适合于实时通信,当网络阻塞时,不影响发送端的发送效率。
TCP控制传输协议,它充分实现了数据传输时的各种控制功能:
针对发送端发出的数据包确认应答信号ACK;
针对数据包丢失或者出现定时器超时的重发机制;
针对数据包到达接收端主机顺序乱掉的顺序控制;
针对高效传输数据包的滑动窗口控制;
针对避免网络拥堵时候的流量控制;
针对刚开始启动的时候避免一下子发送大量数据包而导致网络瘫痪的慢启动算法和拥塞控制。
此外,TCP作为一种面向有连接的控制传输协议,只有在确认对端主机存在时才会发送数据,从而可以控制通信流量的浪费。
TCP通过序列号、超时重传、检验和、流量控制、滑动窗口、拥塞控制实现可靠性。
停止等待协议也是为了TCP协议传输稳定可靠,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
UDP/TCP的区别?
答:可以从连接方式、通信方式、传输单位、对系统资源要求、安全性、对应协议等几个方面回答,具体看上文表格。
TCP的三次握手与四次挥手,画出流程图。为什么TCP要三次握手,两次有什么问题?为什么要四次挥手?三次有什么问题?CLOSE_WAIT和TIME_WAIT的作用。
答:具体看上文。
什么叫稳定连接?
TCP怎么实现可靠传输?
答:TCP通过序列号、超时重传、检验和、流量控制、滑动窗口、拥塞控制实现可靠性。具体看上文。
解释TCP的滑动窗口如何实现,除了流量控制还有什么作用?
答:具体看上文。还可以加速数据传输。
TCP的nodelay,keepalive是干什么的?底层原理?
TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,且有可能导致在一个无效的数据链路层面发送业务数据,结果就是发送失败。所以服务器端要做到快速感知失败,减少无效链接操作,这就有了TCP的Keepalive机制。
socket编程中,UDP一个一个报文接收就可以,TCP也是这样吗?
答:TCP比UDP多了listen和accept。具体可以看我的博客
客户端和服务器是怎么连接通信的?介绍下
答:Socket通信流程。具体可以看我的博客
有哪些机制和可以提高UDP可靠性;设计一个可靠的UDP。
参考TCP的可靠性实现机制。UDP可以加入超时重传(能避免数据报丢失),提供确认序列号(对数据报进行确认和排序)
在游戏开发中应该使用TCP还是UDP,为什么?梦幻端游使用TCP还是UDP,吃鸡手游呢?
UDP只适合丢消息无所谓, 流畅时能快速响应的情况。如视频等,赛车游戏等(第一个定位包丢了, 没事, 下一个定位包能把位置定准。)
TCP能胜任很多情况。但它有一些缺点,第一 延迟发送,不够实时,快速。第二 流式接口, 所以有沾包问题(加包头就解决了)。比如在低可靠网络上的重传会加剧网络性能恶化。
在实时性方面,TCP协议的网络抗性欠佳,对MOBA类或其他实时性要求较高的游戏,一般是不建议使用TCP作为协议载体。事实上,王者荣耀的PVP通信协议也确实是基于UDP封装的;同样,最近大家喜闻乐见的《绝地求生》,也是基于UDP的。
客户端和服务器采用多路复用,一连发送两个IPC包(没听明白),客户端收到1.5个IPC包??什么原因?怎样解决?在这中间过程,包在哪里传输的?
客户端服务器已经断开连接,客户端再次收到RST包,为什么?怎样处理?
网络里面的滑动窗口(拥塞窗口)知道吗?讲述一下它的扩容过程?
TCP,UDP
项目中的重传时间如何确定。
TCP的RTO计算公式
epoll_wait是否线程安全
TCP是如何实现可靠传输的
14. 了解epoll吗,为什么epoll会比较快,epoll的原理
15. linux文件最大有多大-(回答的不太符合面试官想要的答案,又提示了虚拟内存)>虚拟内存原理
进程是一段程序在一个资源集合上的一次执行过程,是操作系统资源分配的基本单位。
线程是进程中的一个执行,他不拥有资源,是操作系统调度执行的最小单位。
a、进程是程序的一次执行,线程是进程中的执行单元;
b、进程间是独立的,这表现在内存空间、上下文环境上,线程运行在进程中;
c、一般来讲,进程无法突破进程边界存取其他进程内的存储空间;而同一进程所产生的线程共享内存空间;
d、同一进程中的两段代码不能同时执行,除非引入多线程。
进程与线程的区别:
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
区别 | 进程 | 线程 |
---|---|---|
开销 | 每个进程都有独立的代码和数据空间,程序之间的切换有较大开销; | 同一类线程共享代码和数据空间,又有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。 |
环境 | 在操作系统中能同时运行多个进程 | 同一个进程中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行) |
内存分配 | 系统会为每个进程分配不同内存空间 | 系统不会为线程分配内存。线程组之间只能共享来自其所属进程的资源。 |
进程创建和撤销的开销比较大,每次创建和取消都要分配一个进程控制块。比如频繁建立连接,使用多线程;cpu频繁切换使用多线程。多线程适用于多核处理机。
但是多进程可以使用在多机分布式系统,需要扩展到其他机器上,使用多进程。
那如果有很多任务,创建线程越多越好吗?
不是,创建线程越多,对共享资源同步要求多,设计同步容易出错。另外多线程并发容易导致资源分配问题
有没有优化的方式呢?很多线程任务,怎么解决呢 线程池
就绪:当一个进程获得了除了CPU以外的所有资源,处于就绪状态
运行:获得CPU以后,任务调度,转换到执行状态,如果时间片用完,又会回到就绪状态
阻塞:处于执行过程中的进程,由于I/O请求,变到阻塞状态
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)
先来先服务、短作业(进程)优先、优先权调度算法、高响应比优先、基于时间片的轮转调度算法
线程之间共享数据的方式
1. 进程和线程区别;
答:从概念上进行区分,具体见上文。一个进程可创建一个或多个线程,一个线程(主线程)可创建一个或多个线程。进程有独立的地址空间,线程没有。线程与线程通信不可使用共享内存。
2. 什么场景下用多进程,什么场景用多线程
答:需要频繁建立连接、CPU频繁切换时使用多线程。多核处理机用多线程,多机分布式系统用多进程。
4. 进程线程内存分配方式的区别
进程的内存占用分为哪几部分;
进程内存分哪几个区,他们怎么分布的
5. 线程共享什么?
答:进程代码段、进程的公有数据 、进程打开的文件描述符 、信号处理器、 进程用户ID、进程组ID
线程 | 内容 |
---|---|
线程独有 | 线程ID 寄存器组的值 线程堆栈 错误的返回码 线程的信号屏蔽码 |
线程共享 | 进程代码段 进程的公有数据 进程打开的文件描述符 信号处理器 进程用户ID和进程组ID |
6.线程的锁机制
为了保证线程安全,有乐观锁,悲观锁
6. 进程怎么通信?
答:信号、信号量、消息队列、共享内存
7. 为什么一个线程崩溃会导致整个进程崩溃?
答:线程能不能脱离进程而存在?
图的最小生成树
LINUX的VFS
先是操作系统,32位系统,64位,int,指针的大小等。。(难的就不会了,也就没接着问)
linux系统了解么?动态链接和静态链接的区别
1. 虚拟内存如何实现的
答:虚拟内存的实现有以下三种方式:请求分页存储管理、请求分段存储管理、 请求段页式存储管理。
2. 内存对齐?为什么要内存对齐?
答:内存对齐是按照成员的声明顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍。
为什么要内存对齐?①平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。②性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
4. 程序是怎样在内存中存储的?
5. 进程的虚拟内存和物理内存的区别和联系?
虚拟内存优点:①当不同的进程使用同一段代码时,比如库文件的代码,在物理内存中可以只存储一份这样的代码,不同进程只要将自己的虚拟内存映射过去就好了,这样可以节省物理内存②在程序需要分配连续空间的时候,只需要在虚拟内存分配连续空间,而不需要物理内存是连续的。这样就可以有效地利用我们的物理内存。
7. 用过共享内存吗?没有。
8. 内存模型
操作系统 (页表放置,进程切换与页表切换机制,进程线程理解)
了解哪些文件系统(忘了是FAT、NTFS这些…);
阻塞:处于执行过程中的进程,由于I/O请求,变到阻塞状态
死锁是指多个进程因抢占资源而发生的一种阻塞且相互等待的现象 ,死锁的产生源于系统资源不足和进程推进顺序不当 ,可以通过终止和撤销进程来解除死锁。
**产生死锁的四个必要条件:**只要系统发生死锁,这些条件必然成立,而只要条件之一不满足,就不会发生死锁。
条件 | 描述 |
---|---|
互斥条件 | 一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。 |
请求与保持条件 | 进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。 |
不可剥夺条件 | 进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。 |
循环等待条件 | 若干进程间形成首尾相接循环等待资源的关系 |
死锁的避免和预防:
死锁预防是设法至少破坏产生死锁的四个必要条件之一。
死锁避免则不那么严格的限制产生死锁的必要条件的存在。是在系统运行过程中注意避免死锁的最终发生。
死锁避免:线性资源分配法、系统安全状态法、银行家算法 参考博客
5.操作系统 CPU缓存是如何读取数据的?缓存替换算法?(LRU) LRU一般使用什么实现的?(双向链表+hash)
2、操作系统为什么要任务切换,任务切换的目的是啥?
答:最大化CPU利用率,举了个IO和CPU计算同时的例子。
18.线程同步的加锁方法有哪些
19.进程切换为什么比线程切换开销大,介绍TLB
20.死锁相关 包括死锁的必要条件,银行家算法等
21.平时有多线程开发经验吗