作业-day-240521

发布于:2024-05-24 ⋅ 阅读:(56) ⋅ 点赞:(0)

多点思维导图

面试题

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)并行在多核处理器系统中存在,而并发可以在单核处理器和多核处理器系统中都存在。


网站公告

今日签到

点亮在社区的每一天
去签到