1:tcp和udp的区别
2:流量控制和拥塞控制的实现机制
3:滑动窗口的实现机制
4:多线程如何同步。
5:进程间通信的方式有哪些,各有什么优缺点
6:tcp链接创建的时候3次握手的具体过程,以及其中的每一步是为何
7:tcp断开链接的具体过程,其中每一步是为何那么作
8:tcp创建链接和断开链接的各类过程当中的状态转换细节
9:epool与select的区别
10:epool中et和lt的区别与实现原理
11:写一个server程序须要注意哪些问题
12:项目中遇到的难题,你是如何解决的
面试
3. 网络编程的通常步骤编程
对于TCP链接:服务器
1.服务器端1)建立套接字create;2)绑定端口号bind;3)监听链接listen;4)接受链接请求accept,并返回新的套接字;5)用新返回的套接字recv/send;6)关闭套接字。cookie
2.客户端1)建立套接字create; 2)发起创建链接请求connect; 3)发送/接收数据send/recv;4)关闭套接字。网络
TCP总结:多线程
Server端:create -- bind -- listen-- accept-- recv/send-- close并发
Client端:create------- conncet------send/recv------close.框架
对于UDP链接:异步
1.服务器端:1)建立套接字create;2)绑定端口号bind;3)接收/发送消息recvfrom/sendto;4)关闭套接字。socket
2.客户端:1)建立套接字create;2)发送/接收消息sendto/recvfrom;3)关闭套接字.
UDP总结:
Server端:create----bind ----recvfrom/sendto----close
Client端:create---- sendto/recvfrom----close.
4.sendMessage与postMessage区别?
不一样点:sendMessage发送完毕之后须要等待处理完才返回;而postMessage发送消息后当即返回。
Do not post the WM_QUIT message using PostMessage; use thePostQuitMessage function.
postMessage将消息放置到消息队列中,不等待线程处理消息就当即返回。
sendMessage发送指定的消息到窗口,并会调用窗口过程,直到窗口过程处理完毕后才返回。
5. TCP的重发机制是怎么实现的?
1.滑动窗口机制,确立收发的边界,能让发送方知道已经发送了多少(已确认)、还没有确认的字节数、尚待发送的字节数;让接收方知道(已经确认收到的字节数)。
2.选择重传,用于对传输出错的序列进行重传。
6. TCP和UDP的区别?
1)TCP面向链接(三次握手机制),通讯前须要先创建链接;UDP面向无链接,通讯前不须要创建链接;
2)TCP保障可靠传输(按序、无差错、不丢失、不重复);UDP不保障可靠传输,使用最大努力交付;
3)TCP面向字节流的传输,UDP面向数据报的传输。
7.进程间通讯有哪些方式?
1)共享内存,如剪贴板;
2)匿名管道/命名管道;
3)邮槽。
其中共享内存、匿名管道只能实现两个进程间的通讯,不能跨网络通讯;命名管道和邮槽能够跨网络进程间通讯;但命名管道属于点对点的通讯,可传输大数据量;而邮槽一次传输的数据量很是有限,一般少于424字节。
8.TCP为何不是两次链接?而是三次握手?
若是A与B两个进程通讯,若是仅是两次链接。可能出现的一种状况就是:A发送完请报文之后,因为网络状况很差,出现了网络拥塞,即B延时很长时间后收到报文,即此时A将此报文认定为失效的报文。B收到报文后,会向A发起链接。此时两次握手完毕,B会认为已经创建了链接能够通讯,B会一直等到A发送的链接请求,而A对失效的报文回复天然不会处理。依次会陷入B忙等的僵局,形成资源的浪费。
相对于SOCKET开发者,TCP建立过程和连接折除过程是由TCP/IP协议栈自动建立的.所以开发者并不须要控制这个过程.可是对于理解TCP底层运做机制,至关有帮助.
并且对于有网络协议工程师之类笔试,几乎是必考的内容.企业对这个问题热情之高,出乎个人意料:-)。有时上午面试前强调这个问题,并重复讲一次,下午几乎每个人都被问到这个问题。
所以在这里详细解释一下这两个过程。
TCP三次握手
所谓三次握手(Three-way Handshake),是指创建一个TCP链接时,须要客户端和服务器总共发送3个包。
三次握手的目的是链接服务器指定端口,创建TCP链接,并同步链接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
SYN攻击
在三次握手过程当中,服务器发送SYN-ACK以后,收到客户端的ACK以前的TCP链接称为半链接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
Syn攻击就是 攻击客户端 在短期内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,因为源地址是不存在的,服务器须要不断的重发直 至超时,这些伪造的SYN包将长时间占用未链接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引发网络堵塞甚至系统瘫痪。
Syn攻击是一个典型的DDOS攻击。检测SYN攻击很是的方便,当你在服务器上看到大量的半链接状态时,特别是源IP地址是随机的,基本上能够判定这是一次SYN攻击.在Linux下能够以下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV
通常较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增长最大半链接和缩短超时时间等.
可是不能彻底防范syn攻击。
TCP 四次挥手
TCP的链接的拆除须要发送四个包,所以称为四次挥手(four-way handshake)。客户端或服务器都可主动发起挥手动做,在socket编程中,任何一方执行close()操做便可产生挥手操做。
参见wireshark抓包,实测的抓包结果并无严格按挥手时序。我估计是时间间隔过短形成。
source url:http://bluedrum.cublog.cn
9. connect方法会阻塞,请问有什么方法能够避免其长时间阻塞?
能够考虑采用异步传输机制,同步传输与异步传输的主要区别在于同步传输中,若是调用recvfrom后会一致阻塞运行,从而致使调用线程暂停运行;异步传输机制则否则,会当即返回。
8.网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
答案一:
1,进程:子进程是父进程的复制品。子进程得到父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它能够与同进程的其余线程共享数据,但拥有本身的栈空间,拥有独立的执行序列。二者均可以提升程序的并发度,提升程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则能够跨机器迁移。
答案二:
根本区别就一点:用多进程每一个进程有本身的地址空间(address space),线程则共享地址空间。全部其它区别都是由此而来的:
1。速度:线程产生的速度快,线程间的通信快、切换快等,由于他们在同一个地址空间内。
2。资源利用率:线程的资源利用率比较好也是由于他们在同一个地址空间内。
3。同步问题:线程使用公共变量/内存时须要使用同步机制仍是由于他们在同一个地址空间内。
等等
9. 简述Windows编程容易出错的几点
10.Windows编程的知识点,如消息机制,一个自定义消息如何实现。
自定义消息共分为3步骤:
1) 自定义消息:#defineWM_MYMSG WM_USER+1
2) 在头文件中声明函数: afx_msg voidonMyMsg();
3) 在消息映射中添加对应关系:
//BEGIN_MESSAGE_MAP(CDefMsgDemoDlg,CDialog) //END_MESSAGE_MAP()
ON_MESSAGE(WM_MYMSG,onMyMsg)
4)定义函数void onMyMsg();
核心即:函数原型、关联消息与消息响应函数的宏、函数实现。
11.SNMP协议
简单网络管理协议——应用层协议.
包括5种数据包:Get-Request;Get-Next-Request; Set-Request, Get-Response; Trap;
12.RAW套接字
普遍应用于高级网络编程,如SNIFFER、拒绝服务、IP欺骗都是经过原始套接字实现的。
13. 窗口建立的步骤:
1)设计窗口类(填充结构体)à2)注册窗口类RegisterClassà3)建立窗口;4)显示ShowWindow&更新窗口UpdateWindowà4)循环获取消息GetMessage(){翻译(转换)TranslateMessage消息、处理消息DispathMessage(将消息交付给窗口过程进行处理)}。
14. 当触发按钮之后发生了什么?
1)好比点击鼠标左键后,操做系统首先会感知到该事件;2)操做系统将事件其转化为消息;3)操做系统将消息投递到对应程序(线程)的消息队列中;4)应用程序(线程)从消息队列中经过GetMessage获取消息,并经过DispathMessge将消息交付给操做系统;5)操做系统经过设计窗口类时指定的窗口过程对对消息进行处理。
15. 你平时是如何调试程序的?(引伸)当一个程序在本身机器上运行正常,可是在其余机器上程序运行崩溃,如何查找缘由?
断点调试:
值:查看变量(Variables)、表达式、内存(Memory)、寄存器(Register)的值。
进程控制:VC容许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F五、F10/F11和CTRL+F10。
其余调试手段:系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息TRACE、ASSERT、VERIFy。Ctrl+B打开断点设置。
运行崩溃,如何查找缘由? [提示后],能够经过打印语句来发现错误!
16. 线程、窗口、消息队列三者之间的关系?
MSDN上如是说:
Thethread to which the message is posted must have created a message queue,or elsethe call to PostThreadMessage fails.
并提供了以下两种解决方法:
CallPostThreadMessage.If it fails, call the Sleep function and call PostThreadMessageagain. Repeat until PostThreadMessage succeeds.
【面试官】说:一个线程对应一个或多个窗口(建立的关系),同时一个线程对应了一个消息队列。
【总结以下】:1.在MFC程序框架里面,CWinThread专门负责线程建立的,它能够建立用户界面线程,及工做者线程。其中用户界面线程是包含消息队列的,而工做者线程是不包含消息队列的。即【一句话】:用户界面线程对应一个消息队列。2.CWinThread类和CWnd类都派生自CCmdTarget,而CDialog对话框类、视图类CView都派生自CWnd。【深刻浅出MFC里一句话】:不是每个窗口都产生一个线程(由于要付出昂贵的线程切换代价)。即,深刻理解之:一个线程能够对应多个窗口。主线程能够建立出其所要的所有窗口。