Linux 网络开发常见面试题回顾

一、TCP 和 UDP 有什么不同?
      (1)在链接状态上,TCP 是面向链接的,UDP 则是面向无链接的;
      (2)在数据传输的质量上,TCP 以数据流的方式传输,保证数据的有序性,准确性,完整性,数据传输质量高;UDP 则是以数据报的形式,独立发送数据报,不能保证数据是否到达,是否完整,是否有序,数据传输质量低于TCP;
      (3)在数据包的大小上,TCP 包头 20个字节,选项 12个字节,但是 UDP 只有 8个字节;
      (4)在系统资源的利用上,每个 TCP 链接,系统要维护一个 8k 的链接结构,而 UDP 则不需要;

二、UDP 的 connect 有什么作用?
       UDP 的 connect  和 TCP 的 connect 不同之处在于,UDP connect 的时候只会进行对端的记录,以及显而易见的错误的检查(比如 IP 压根儿填错了啊),而没有 TCP 的三次握手操作;这时,当前的 UDP socket 也被限定于只与 connect 指定的对端通信,当前的 socket 发生的异常也只会通知到 当前进程;同时,UDP 的 connect 是可以进行重复操作进行对端更新的,即 connect 完 A 之后,再调用 connect B 也是可以的,这与 TCP 不同。
      UDP 链接的两种模式:
              (1)socket ---> sendto ---> recvfrom
              (2)socket ---> connect ---> send ---> recv 
      第二种模式也是可以使用 sendto 和 recvfrom 的,但是 参数内的 地址信息需要置成 NULL。

三、TCP 链接的三次握手,四次挥手时序图
      三次握手:
            A 发 链接包( SYN=1, SEQ=x) ,B 同意 则返回确认链接包( ACK=x+1, SYN=1, SEQ=y),A 返回确认包( ACK=y+1, SEQ=x+1)
      四次挥手:
            A 发 关闭包( FIN=1, SEQ=x), B 返回 同意包(ACK=x+1),B 发送关闭包(FIN=1,SEQ=y), A 返回 同意包(ACK=y+1)。

四、TCP 和 UDP socket 服务器端的实现流程
      TCP 服务器端:
            socket ---> bind ---> listen ---> accept ---> close
      UDP 服务器端:
            socket ---> bind ---> sendto ---> recvfrom ---> close

五、select, poll, epoll 的区别 及 选择
      select 是采用内核轮询方式,每次调用都需要轮询 FD_SET,默认最多可以接受 1024 个fd,可更改为更大,但是随着数量的增多,轮询周期的变长,性能会急剧下降;
      poll 是 select 的改进版,将 FD_SET 该造成由( fd,监听事件类型,实际事件类型 )为节点组成的链,解除了1024 的限制,其他并无大的区别,当 fd 多时,同样会造成效率下降;
      epoll 将 轮询机制 改造为 事件触发机制,给每一个 fd 附上一个 callback,当监听事件发生时,就将 fd 链接到 就绪链表,调用 epoll_wait 时,只用检查就绪链表就可以了,而不需要像 select 和 poll 一样进行轮询。
      另外,select 和 poll 是将存有 fd 的结构或者数组再每次调用的时候都复制到内核态,然后调用完再复制回用户态,而无所谓是否有意义。epoll 使用内存映射,减去了这部分的data-copy操作。
      再者,从触发方式上来看,select 和 poll 都只有 条件触发(也可以叫水平触发),epoll 则有条件触发 和 事件触发(也可以叫边缘触发)两种。
      在选择使用哪种方式的时候,需要根据 fd 的多少和活跃程度来判断。当fd 数量较少,且都比较活跃的时候,使用 select 或者 poll 反而有可能效率更高,因为毕竟 epoll 要有多次的回调函数。
      好东西都是要付出代价的!
 
六、epoll 有哪些事件触发方式,各自有什么特点和缺点,对应怎样的编程解决办法
      epoll 的事件触发方式有两种,Level Trigger(LT) 和 Edge Trigger(ET),按字面意思翻译过来就是 水平触发 和 边缘触发,如果按照意译方式翻译,可以翻译为 条件触发 和 事件触发。顾名思义,条件触发,如果满足某个条件,则触发,也就是说只要条件不变,每次探测都会触发;事件触发则是在指定事件发生时触发,然后等待下一次事件发生再触发。
       条件触发(即水平触发)会一直触发,直到条件不满足,也就意味着如果当前 fd 里的任务处理不完,是可以放到下一次处理的,因为下一次探测还是会有这个fd。缺点也是这样,如果fd 的可写条件满足了,写不满,会一直触发可写。
       事件触发(即边缘触发)只触发一次,如果当前来不及处理,也不会再触发。相对来说,编程要复杂一些。比如当前监听 的sockfd,如果可以accept 则 需要一直 accept 到发生 EAGAIN 错误,如果可以 read,则需要read 到发生 EAGAIN 错误,可以write 的时候也一样,因为只有这样才能把里边的数据处理完,因为下一次触发谁知道是什么时候,而这一次的数据没读完整也是不行的。
       
七、TCP 的 timewait 状态是什么?谁会有 timewait 状态?timewait 状态存在的作用是什么?如何避免大量的 timewait 状态占用系统资源?
       timewait 状态是 TCP 链接的 主动关闭方 会有的状态,在发出最后一个 ACK 包之后,主动关闭方进入 timewait 状态,以确保 ACK 包到达对端,以及 等待网络中之前迷路的数据包完全消失,防止在端口被复用的时候收到迷路包从而出现收包错误。
       timewait 状态会持续 2MSL(max segment lifetime) 的时间,一般会有 1分钟到4分钟事件。这段事件内 端口不可被重分配使用。 
       timewait 并不会占用更多系统资源,但是可以通过修改内核参数 /etc/sysctl.conf 来达到 限制timewait 数量的功能。

八、TCP 的头有多少个字节?有哪些字段?
       TCP 头有 20个字节,选项12个字节,字段有 源端口号16位,目的端口号16位,SEQ32位,ACK32位,包头长度4位,保留字段6位,包类型6位,窗口大小16位,校验和16位,紧急指针16位。之后是 可选项 8 的整数倍,数据

九、什么是滑动窗口?有什么作用?
      滑动窗口是TCP 中使用的一种提升传输效率和进行流量控制的方法。接收方使用滑动窗口告诉发送方自己的缓冲区可以接收多大的数据,而发送方则通过滑动窗口确认发送数据的大小。滑动窗口大小位0 时,发送方不再发送数据。但是两种情况除外,一种是紧急数据,一种是1字节的数据,主要用来通知接收方确认希望接收的下一字节和发送方的滑动窗口大小。

十、connect 会阻塞,应该怎么解决?
    (1)设置socket fd 为O_NONBLOCK 非阻塞模式
    (2)connect 会立即返回,判断返回值,如果为0,表示建立成功,如果为 -1,则检查 errno 是否为 EINPROGRESS,表示正在建立,否则为发生错误;
    (3)将 sockfd 加入 select 模型,并设定超时时间;
    (4)如果 select 返回可写,调用 getsockopt 检查 SO_ERROR,如果为 0,表示建立成功,否则失败;
    (5)恢复 sockfd 的文件状态,并返回。

十一、如果 select 返回可读,结果只读到 0 字节,这是什么情况?
          对端关闭,可读,read 返回 0,表示已经读到文件末尾。
 
十二、keepalive 是什么?起什么作用?起作用的过程是什么?
         keepalive 是 TCP 协议内的心跳机制,用来维护链接的状态,默认不开启。服务器端每隔一段事件会向空闲两小时以上的链接的对端发送一个 keepalive 包,有以下情形:
       (0)对端回复 ACK,链接保活,再次空闲两小时后重新探测;
       (1)对端的应用程序已经退出,TCP 回复一个 RST包,链接关闭;
       (2)对端的应用程序卡死/无反应,TCP 回复一个 FIN包,来终止链接;
       (3)对端机器无任何反应,服务器端将持续发送 keepalive 包,超时则关闭链接。时间范围半小时到两小时。

十三、列举你知道的 TCP 选项,并说明作用
         MSS :Max Segment Size,最大分片长度,非协商值,是对数据发送方发送数据最大长度的限制
         SACK:Selective ACK,可选选项,即数据流传输过程中某一个分片丢失,可以请求只重传这一个分片,而不用重传丢失分片后的所有数据。
         
十四、socket 在什么情况下可读?
        (1) 正常有数据输入的时候;
        (2) 有异常发生的时候,read 返回 -1,errno 置为错误编号;
        (3) 对端关闭的时候,read 返回 0, 表示读文件结束;
        (4) 当这个socket 是一个监听 socket ,且连接数不为0,又有 SYN 进来时。

十五、如果链接量非常大,你会怎么设计并发模型
          
附加:一个每秒百万级访问量的互联网服务器,每个访问都有数据计算和 I/O 操作,如果让你设计,你怎么设计?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值