多点思维导图
面试题
1、项目中如何实现TCP的并发
1)、一般的TCP服务器通信,只能完成一个客户端的操作。要实现多客户端的通信,可使服务器端循环创建并收发客户端的通信。
2)、但仅循环服务器使用的情况,由于accept、send、recv函数都是阻塞函数,必须等上一个任务执行完成后,才能执行下一个任务。
3)、为了解决上述问题,可以采用多进程和多线程的的方式实现多任务并发。
4)、多进程实现原理:
父进程:用于接收客户端的连接请求,并创建子进程。
子进程:只负责和客户端进行通信。
5)、多线程实现原理:
主线程:用于客户端的连接请求,并创建分支线程。
分支线程:只负责和客户端进行通信。
6)、注意资源回收:
子进程结束时,非阻塞形式(waitpid)回收资源。
分支线程创建时,设置分离态,结束时自动回收资源。
2、TCP通信的三次握手、四次挥手过程
三次握手:
1)主机A向主机B发送连接请求
2)主机B向主机A发送同意回复并发送连接请求
3)主机A向主机B发送收到回复
四次挥手:
1)主机A向主机B发送断开请求
2)主机B向主机A发送同意回复
3)主机B向主机A发送断开请求
4)主机A向主机B发送收到回复
TCP/IP协议分层及常见的协议
共有4层
应用层:
HTTP超文本传输协议(万维网的数据通信的基础)
FTP文件传输协议(用于在网络上进行文件传输的一套标准协议,TCP传输)
TFTP简单文件传输协议(用于在网络上进行文件传输的一套标准协议,UDP传输)
SMTP简单邮件传输协议(一种提供可靠且有效的电子邮件传输的协议)
传输层:
TCP传输控制协议(是一种面向连接的、可靠的、基于字节流的传输层通信协议)
UDP用户数据报协议(是一种无连接、不可靠、快速传输的传输层通信协议)
网络层:
IP网际互连协议(能够在多个不同网络间实现信息传输的协议)
ICMP互联网控制信息协议、IGMP互联网组管理
数据链路层:
ARP地址解析协议(通过IP地址获取对放mac地址)
RARP逆向地址解析协议(通过mac地址获取IP地址)
3、UDP传输丢包原因?发生在哪一层?
主要发生在网络层
丢包原因:
1)发送频率过快:UDP的sendto函数不会造成线程阻塞,不会像TCP中的send函数那样,直到数据完全发送才会return回调用函数,它不保证当执行下一条语句时数据是否被发送。
2)发送的报文过大,超过接受者缓存导致丢包。
3)网络连接不稳定
避免方法:
1)发送端控制发送评论。发送时使用usleep(1)延迟1微秒发送,即发送频率不要过快,延迟1微妙发送。
2)增大接受端缓存区。设置socket接收缓冲:
int nRecvBuf=64*1024;//设置为64K
setsockopt(rfd,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
3)使用可靠的网络连接
4、同步和异步的区别?TCP是同步还是异步?
同步:多任务间有计划顺序的去执行。
异步:多任务间无指向顺序,哪个任务抢到时间片即指向。
TCP为同步,
服务器端任务执行顺序:收到客户端连接---->收到客户端信息---->返回信息到客户端
客户端任务执行顺序:和服务区端建立连接---->先服务器端发送信息---->接收服务器端的返回信息
5、TCP沾包现象?如何避免?
当TCP发送的多个数据包较小且前后间隔时间很短时,两个文件可能会被沾成一个数据包发送。
避免方式:
1)发送数据间间隔一段时间sleep。
2)格式化数据:每条数据有固定的格式(开始符、结束符)
3)发送数据长度:发送每条数据时,将数据长度一起发送。
6、组播和广播的异同
相同点:
1、都是一对多通信,所有接收端都会收到信息;2、都是通过UDP实现;3、都需加入相应的地址组才能接受到信息;4、都分为接收端和发送端;5、信息只能在当前网络中传输,无法通过路由。
不同点:
1、广播占用的网络带宽较大,容易影响通信。组播占用的网络带宽较小;
2、广播使用的地址:网络号+255
组播使用的地址:D类网络[224.0.0.0~~239.255.255.255]
7、阻塞IO和非阻塞IO的区别
阻塞IO:当程序执行IO操作时,会发生阻塞直到操作完成。
1)针对阻塞IO的系统调用(如read, write)可能因为无法完成而被系统挂起,直到等待的事件发生为止。举例:read和write,通常IO操作都是阻塞I/O的,也就是说当你调用read时,如果没有数据收到,那么线程或者进程就会被挂起,直到收到数据。
2)阻塞IO是同步的,应用程序必须等待IO操作完成。
3)执行IO操作时,线程被阻塞,不能执行其他任务。
4)阻塞IO往往是单线程处理IO请求。
非阻塞IO:允许程序在进行IO操作时继续执行其他任务。
1)针对非阻塞IO的系统调用总是立刻返回,不管事件是否发生,如果事件没有立刻发生就返回-1,并且设置errno。对于accept,recv 和 send,事件未发生时,errno 通常被设置成 EAGAIN。
2)非阻塞IO是同步的,但可以通过设置非阻塞标志来实现异步效果。
3)执行IO操作时,线程不会被阻塞,可以继续处理其他任务。
4)非阻塞IO往往需要使用循环轮询或选择机制来判断IO操作是否就绪。
8、并发和并行的区别
并发:对于单核CPU,通过时间片分配机制,宏观上显示多个任务同时在执行,但微观上,在同一时间片中,只有一个任务在执行。
并行:对于多核CPU,同一个时间片中,会有多个任务在执行。
区别:
1)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。
2)并行在多核处理器系统中存在,而并发可以在单核处理器和多核处理器系统中都存在。