这一篇是网络编程的面试知识点的总结。不打算从计算机网络的基础讲起,只是摘要性的总结一下知识点,更多的内容请从经典的书籍中获取。
1、tcp与udp的区别(必问)
可靠性
首先,TCP是一个面向连接的协议,需要三次握手。具有可靠性,但是并不是百分百的可靠,它通过序列号确认,超时重传等机制提供数据的可靠传送或者故障的可靠通知,但并不能保障数据一定会被对方接收。
UDP是一个无连接的协议。UDP不保证数据报会到达最终的目的地,不保证数据报的先后顺序不变,不保证每个数据报只到达一次。不会自动的重传以及报告错误。协议类型
每个UDP数据报都有一个长度,改数据报的长度随数据一道传递给接收端应用程序,而TCP是一个字节流协议,没有任何的记录边界。TCP和UDP都可以IPv4和IPv6。
流量控制
TCP提供流量控制,TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据。从而保证发送端的发送的数据不会使接收缓冲区溢出。接收端的窗口大小会动态的变化。UDP不提供流量控制。
全双工
TCP连接是全双工的,意味着连接上的应用可以在任何时刻既发送数据又接收数据。需要的话也可转化成单工的连接。UDP**可以**是全双工的。
比较来看,UDP似乎不是很好的选择,但是它胜在速度快(不需要建立连接),占用资源少(不需要状态维护)。报文的首部开销小,8个字节,TCP首部20个字节。从实际应用来说,也会选择UDP模拟实现TCP,或者使用上层协议保证传输可靠。
2、udp调用connect有什么作用?
UDP的connect和TCP的connect不是一个概念,没有三次握手的过程。对于使用connect的已经连接的UDP套接字,与默认的未连接的套接字相比:
再也不能给输出操作指定目的地的IP和端口号。写到已连接UDP套接字上的任何内容都会自动发送到connect指定的协议地址上。使用write或send代替sendto。
不必使用recvfrom获悉数据报发送者,因为从内核返回的数据报只有那些指定协议地址的数据报。改用read,recv,recvmsg。
由已连接UDP套接字引发的异步错误会返回给它们所在的进程。而未连接套接字不接收任何异步错误。
总的来说,connect启动一个声明和限定通信方的作用。同时,更少次数的连接和断开可以提高数据的传输效率。
如果对一个已连接的UDP套接字进程再次调用connect,可以:
1.指定新的IP地址和端口。
2.断开套接字。
3、tcp连接中时序图,状态图,必须非常非常熟练
这个没什么好说的,看图。
4、socket服务端的实现,select和epoll的区别(必问)
基本的socket服务端实现就在上面的图上。
epoll的出现比较晚了,epoll是linux独有的高效的IO复用的机制。先简单提一下poll和select,poll和select很相似,但是poll没有select的文件描述符的限制(默认1024),poll使用pollfd结构代替描述符fd。
而epoll与poll的不同在于:poll每次返回整个文件描述符的数组,用