交易系统开发技能及面试之网络知识
Posted BBinChina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交易系统开发技能及面试之网络知识相关的知识,希望对你有一定的参考价值。
文章目录
概述
网络知识体系是开发人员都必须具备的,本章主要讲解TCP/UDP协议,Socket,IP多播方式。理解非阻塞socket工作方式和怎样设计一个事件驱动系统。
Q1 为什么总问TCP握手过程
TCP为了保证可靠性,第一步要做的就是保证建立的链接是有效可用的,并且确认双方收到消息的序列号起始,通过序列号处理消息丢失后重发,而我们在设计其他系统的时候,也是可以借鉴这种方式。
第一步:
客户端A发送SYN类型消息给服务端B,消息携带客户端的序列号
第二步:
B响应请求后回SYN-ACK消息表示接收到链接请求,SYN-ACK包分为SYN(携带服务端的序列号),和ACK(确认收到的客户端的序列号)
第三步:
A响应B发过来的SYN-ACK包,并发送ACK(确认收到的服务端的序列号)
通过三次握手,最核心的部分是收发双方都确认通信对端当前的序列号起始位置,当有序列号数据包未确认时,可以重发来确保通信的可靠性。
Q2 当客户端没有通知服务端关闭链接时异常退出,服务端如何处理链接状态?
TCP链接有keepalive标志,当开启keepalive时,tcp会建立一个定时器,当定时时间到时,服务端会发送一个keepalive的探测包,当在配置的时间段内客户端没有回报时,该链接会被认为无效而关闭相关资源。
Q3 tcp是如何处理快生产慢消费的?
快生产慢消费是普遍场景,通常在消费端处理能力无法在提升时,为保证系统"可用性"即大部分生产数据能够被处理,非不可工作状态,在消费端会进行一些负载或者熔断处理。那么TCP又是如何处理这种场景的呢?TCP在服务端采用流控制的机制,来避免接收大量的数据。我们知道TCP采用数据包确认的方式,当服务端收到客户端数据包时,在返回的确认包中携带服务端当前缓冲区可接收的数据包容量,通过这种机制,客户端可以实时控制发送的数据包来缓解服务端的接收压力。
Q4 什么是MTU?
MTU(Maximum Transmission Unit)最大传输单元,IP数据报在链路层中可传输的最大量。如果一个数据报大于链路层规定的MTU,那么IP层需要对数据报进行分片,然后再接收端进行整合,每个分片的大小都小于MTU值。每个链路的MTU值可设置不同,因此分片的最大值为整条链路中最小链路的MTU。
Q5 比较TCP跟UDP?
可靠性:
TCP采用重传机制,保证到达接收端的数据包是有序确没有丢失的,除非网络异常链接中断(所以也有TCP是面向链接的说法)。
UDP没有可靠性保证机制,认为发送即成功,所以服务端接收的数据包是无序保证且可能丢失。
性能:
因为TCP需要处理数据包顺序跟重传,所以数据包发送性能比UDP慢。
Q6 客户端是如何加入IP多播流?
IP多播:源主机在发送多播数据包经过路由器(多播路由器)时,路由器会将数据包复制成多份发往感兴趣的客户端。那么客户端加入多播流的方式是采用ICMP协议,客户端发送IGMP(Internet Group Management Protocol 互联网组管理协议)消息给路由器,路由器基于IGMP将客户端感兴趣的多播流记录起来,当多播数据流到达路由器时,路由器根据记录将数据转发给客户端。
Q7 使用非阻塞socket的优势
非阻塞socket不会让发送数据的线程在没有数据发送时进入睡眠等待唤醒状态,而是让线程继续处理其他的工作。非阻塞socekt比设置超时时间和阻塞Socket的select系统更具优势,因为select当socket准备就绪唤醒socket时,而socket仍需进行阻塞读写,但是数据包有可能因为各种原因而丢失时,此次唤醒会导致读写失败。
Q8 比较select 跟 poll系统
调用select时,即使select监听着少量的socket句柄,我们也需要遍历所有的句柄,收集句柄触发的事件。而且,在每一次select调用之后,内核会覆盖socket句柄的标志位(采用bitmasks),所以在每次调用之前,我们需要重置bitmasks,bitmasks也导致了select只能监听有限的句柄。
poll系统采用pollfd结构体来记录句柄,且使用链表的方式,其优化了select有限bitmasks的限制,而pollfd结构体是可复用的。
进阶
关于大量链接管理的话,我们还会用到epoll(linux)、IOCP(windows)。
还有pselect
https://linux.die.net/man/2/pselect
以上是关于交易系统开发技能及面试之网络知识的主要内容,如果未能解决你的问题,请参考以下文章