1. OSI七层模型
第七层:应用层 数据 用户接口,提供用户程序“接口”。 第六层:表示层 数据 数据的表现形式,特定功能的实现,如数据加密。 第五层:会话层 数据 允许不同机器上的用户之间建立会话关系,如WINDOWS 第四层:传输层 段 实现网络不同主机上用户进程之间的数据通信,可靠 与不可靠的传输,传输层的错误检测,流量控制等。 第三层:网络层 包 提供逻辑地址(IP)、选路,数据从源端到目的端的 传输 第二层:数据链路层 帧 将上层数据封装成帧,用MAC地址访问媒介,错误检测 与修正。 第一层:物理层 比特流 设备之间比特流的传输,物理接口,电气特性等。
2. TCP/IP有哪几层
①网络接口层
②网络层
③传输层
④应用层
3. ARP协议的用途 及算法、在哪一层上会使用arp ?
根据IP地址获得MAC,TCP/IP上是网络层
4.分组转发算法
(1)
从数据报的首部提取目的站的 IP 地址 D, 得出目的网络地址为 N。
(2) 若网络 N 与此路由器直接相连,则直接将数据报交付给目的站 D;否则是间接交付,执行(3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则将数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
(4) 若路由表中有到达网络 N 的路由,则将数据报传送给路由表指明的下一跳路由器;否则,执行(5)。
(5) 若路由表中有一个默认路由,则将数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
(6) 报告转发分组出错。
5. TCP与UDP的概念,相互的区别及优劣。
TCP和UDP都是传输层的协议,他们的区别主要如下:
①TCP,全名“传输控制协议”,是面向连接的,也就是说在发送方和接收方在发送数据之前,必须通过三次握手建立连接,相当于现实生活中的打电话功能,必须先拨号,接通后才能说话,UDP,全名“用户数据报协议”,是无连接的,其中一方向向另一方发送数据时不需要建立连接,直接发送,相当于现实中的发短信
②TCP是可靠的传输协议:TCP在IP协议的基础之上添加了序号机制,确认机制,超时重传机制,数据校验,从而保证传输的可靠性,而UDP是不可靠的协议,UDP协议仅仅就是在IP协议的基础上添加了端口和差错检查的功能,由于IP协议时尽最大努力传输,从而导致了UDP的不可靠性
③TCP协议是面向字节流的,TCP将应用层传递下来的数据仅仅当做无结构的数据流,并不知道所传数据流的含义,它可能将应用程序的两个数据块拼接到一起组成一个段发送。UDP是面向报文的,应用程序交给UDP多长的报文,UDP就加上首部后发送,如果报文过大,就会导致IP层分片,从而降低了IP层的效率。
④TCP是一对一通信的,而UDP支持一对一和一对多以及多对多通信
6. 三次握手,四次断开过程
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
7.
四次挥手过程
①客户端执行close原语,发送FIN报文,进入状态FIN_WAIT 1
②服务器收到FIN报文,回应ACK报文,同时进入close_wait状态,客户端收到确认ACK报文,就进入到FIN_WAIT 2状态,此时一个方向上的连接断开。
③服务器在发送完数据后,执行close原语,并发送FIN报文,并进入LAST_ACK状态
④客户端收到FIN报文,进入Time_Wait状态在等待两倍报文最大生存时间后,进入到closed状态。服务器端收到ACK报文后进入closed状态
8. TIME_WAIT状态的意义
因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
9.滑动窗口协议 与停止等待协议的区别
发送窗口维持一个连续的允许发送的的序号,接受窗口维持一个连续的允许接受的序号;当发送窗口和接收窗口的大小大于1时,就可以支持同时发送几个帧和同时接受几个帧
当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait)。该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。
选择重传协议
在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。另一种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发(SELECTICE REPEAT),选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。
11. TCP socket编程流程
服务器:
①socket函数,创建套接字文件描述符,第一参数为协议族,如IPV4,第二参数是类型,如SOCK_STREAM,字节流套接字,适用于TCP,第三参数一般为0,表示1第一第二参数所形成的默认协议如TCP
②bind函数,文件描述符与相应的IP地址和端口绑定
③listen函数,socket函数创建的套接字为主动套接字,调用listen函数可将主动套接字变为被动套接字,即服务器端
④accept函数,内核会为监听套接字维护两个队列,一是未完成连接(三次握手)的队列,二是完成连接的的队列。而accept就从已完成的队列中取出一个已完成的连接,函数的返回参数为连接套接字,用来读写数据,而socket创建的为监听套接字
⑤read函数
⑥write函数
⑦close函数
客户端:
①socket函数,同上
②connect函数,返回连接套接字,用于读写
③read函数
④write函数
⑤close函数
12. epoll和select区别
问题的引出,当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种:
1.使用多进程或者多线程,但是这种方法会造成程序的复杂,而且对与进程与线程的创建维护也需要很多的开销。(Apache服务器是用的子进程的方式,优点可以隔离用户)
2.用一个进程,但是使用非阻塞的I/O读取数据,当一个I/O不可读的时候立刻返回,检查下一个是否可读,这种形式的循环为轮询(polling),这种方法比较浪费CPU时间,因为大多数时间是不可读,但是仍花费时间不断反复执行read系统调用。
3.异步I/O(asynchronous I/O),当一个描述符准备好的时候用一个信号告诉进程,但是由于信号个数有限,多个描述符时不适用。
4.一种较好的方式为I/O多路转接(I/O multiplexing)(貌似也翻译多路复用),先构造一张有关描述符的列表(epoll中为队列),然后调用一个函数,直到这些描述符中的一个准备好时才返回,返回时告诉进程哪些I/O就绪。select和epoll这两个机制都是多路I/O机制的解决方案,select为POSIX标准中的,而epoll为Linux所特有的。
区别(epoll相对select优点)主要有三:
1.select的句柄数目受限,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE 1024 表示select最多同时监听1024个fd。而epoll没有,它的限制是最大的打开文件句柄数目。
2.epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,而epoll是维护一个队列,直接看队列是不是空就可以了。epoll只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数(把这个句柄加入队列),其他idle状态句柄则不会,在这点上,epoll实现了一个"伪"AIO。但是如果绝大部分的I/O都是“活跃的”,每个I/O端口使用率很高的话,epoll效率不一定比select高(可能是要维护队列复杂)。
3.使用mmap加速内核与用户空间的消息传递。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。
11. TCP的流量控制和拥塞控制实现原理(会画拥塞控制的典型图)
TCP的流量控制可通过调节接受窗口的大小来改变
30.阻塞方式和非阻塞方式,阻塞connect与非阻塞connect。(比较难,有兴趣可以了解)