1.TCP和UDP
TCP | UDP | |
共同点 | 传输层协议 | 传输层协议 |
不同点 | 有连接,可靠:数据无误,无丢失,无失序,无重复 | 无连接,不可靠 |
应用场景 | 传输质量高(如qq登录操作) | 要求不高,保证效率(如qq聊天,广播和组播) |
2.TCP三次握手过程
第一次:建立连接,客户端发送SYN(同步序列编号)包(seq=j)到服务器,进入SYN_SENT状态,等待服务器确认。
第二次:服务器收到SYN包,必须确认客户端的SYN(ack=j+1),同时服务器发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次:客户端收到服务器的SYN+ACK包,客户端向服务器发送确认包ACK=K+1,发送完成后两者都进入TCP连接成功状态,三次握手完成。
3.TCP四次挥手过程
第一次挥手:一进程先调用close(主动关闭),这一端发送FIN分节,表示数据发送完成。
第二次挥手:二进程接收端接收到FIN(被动),由TCP确认FIN。
第三次挥手:一段时间后,二进程调用close,并发送FIN。
第四次挥手:一进程接收到FIN由TCP对它确认。
4.TCP如何保证高可靠传输
校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
序列号:TCP 传输时将每个字节的数据都进行了编号,这就是序列号。(为了应对延时抵达和排序混乱)。
确认应答:TCP 传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送 ACK 报文。这个 ACK 报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
超时重传:发送方在发送完数据后等待一个时间,时间到达没有接收到 ACK 报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行 ACK 应答。如果是第 二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送 ACK 应答。
连接管理:三次握手四次挥手。
流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
拥塞控制:拥塞控制是 TCP 在传输时尽可能快的将数据传输,并且避免拥塞造成的一系列问题。是可靠性的保证,同时也是维护了传输的高效性。
5.如何实现并发服务器?
多线程并发服务器:
使用一个主线程监听服务器端口,当有客户端连接请求时,主线程接受连接并创建一个新的线程来处理该连接。(监听一个,创建一个)
每个线程负责与一个客户端进行通信,接收客户端发送的数据并进行相应的处理,然后将处理结果发送给客户端。
多个线程之间共享服务器资源,如共享的数据结构、文件描述符等。需要使用互斥锁等同步机制来保证线程间的数据安全。
多进程并发服务器:
使用一个主进程监听服务器端口,当有客户端连接请求时,主进程接受连接并创建一个新的子进程来处理该连接。
每个子进程负责与一个客户端进行通信,接收客户端发送的数据并进行相应的处理,然后将处理结果发送给客户端。
子进程之间独立运行,拥有各自的地址空间,不会相互影响。
多个进程之间不共享资源,需要使用进程间通信(IPC)机制来传递数据,如管道、消息队列、共享内存等。
6. select、poll、epoll的区别
select | poll | epoll | |
监听个数 | 一个进程(1024) | 程序员决定 | 理论没有限制(取决系统) |
方式 | 每次唤醒并轮询 | 每次唤醒并轮询 | 红黑树内callback回调,不轮询 |
效率 | 描述符越多效率越低 | 描述符越多效率越低 | 不轮询,效率高 |
特点 |
|
|
|
结构 | 文件描述符位表 | 结构体数组 | 红黑树和就绪链表 |
开发复杂度 | 低 | 低 | 中 |
7. Tcp的粘包问题
TCP的粘包问题是指在传输过程中,由于TCP协议的特性,多个数据包可能会被合并成一个大的数据包,或者一个数据包被拆分成多个小的数据包,从而导致接收端无法正确解析和处理数据。
造成TCP粘包问题的主要原因是TCP协议是面向流的,数据流在发送端和接收端之间是连续不断的,而没有消息边界的概念。因此,多个数据包在传输过程中可能会被合并成一个大的数据流,或者一个数据包被拆分成多个小的数据流。
解决方法:
固定长度消息:发送端将每个数据包固定长度发送,接收端按照固定长度来接收和解析数据。这种方法简单直接,但可能会造成数据浪费,因为某些数据包可能会很小,而其他数据包可能会很大。
消息边界标志:发送端在每个数据包的末尾添加特定的标志来表示消息的结束,接收端通过检测标志来识别消息的边界。例如,可以在每个数据包的末尾添加换行符或其他特定字符作为消息边界。
消息长度字段:发送端在每个数据包的头部添加一个表示消息长度的字段,接收端先读取消息长度字段,然后根据消息长度来接收和解析数据。这种方法比固定长度消息更灵活,但需要处理消息长度字段可能被拆分的情况。
使用专门的消息协议:可以定义自己的消息协议,在消息中包含消息长度字段、消息类型等信息,使得接收端可以正确解析和处理数据。
应用层处理:在应用层进行数据的拼接和解析,将多个小数据包合并成一个完整的消息。
8. UDP的丢包问题
UDP的丢包问题是指在UDP协议传输过程中,由于网络原因或接收端处理能力不足,部分数据包可能在传输过程中丢失,导致接收端无法收到完整的数据。
UDP是一种无连接、不可靠的传输协议,它不提供可靠性保证,不保证数据包的顺序和可靠传输。因此,UDP的丢包问题是很常见的情况,特别是在网络状况较差或网络拥堵的情况下更容易发生。
造成UDP丢包问题的主要原因包括:
1. 网络拥堵:当网络中的数据流量超过网络设备处理能力时,会导致数据包丢失。
2. 网络延迟:网络传输的延迟会导致数据包到达接收端的时间不确定,从而可能造成数据包的丢失。
3. 缓冲区溢出:接收端的缓冲区大小有限,如果数据到达速度过快,缓冲区可能会溢出,导致部分数据包丢失。
4. 数据包大小:UDP本身没有数据包大小限制,但在网络传输中,数据包过大可能会被分片,而分片可能会造成部分数据包丢失。
要解决UDP的丢包问题,可以考虑以下方法:
1. 重传机制:在应用层实现重传机制,发送端定时重发未确认的数据包,确保接收端收到完整的数据。
2. 数据包校验:可以在应用层添加数据包序号和校验和等信息,接收端通过校验和来检查数据的完整性,丢弃校验和错误的数据包。
3. 网络优化:优化网络拓扑和带宽,减少网络延迟和拥堵,提高数据传输的稳定性。
4. 应用层处理:在应用层对数据进行分段、拼接和校验,确保数据的完整性。
9. TCP编程框架
服务器端:
socket()函数创建流式套接字用于建立连接
bind()函数绑定服务器ip和端口号
listen()函数改变套接字属性化主动为被动
accept()函数等待连接产生用于通信的套接字
send()/recv()函数读写
close()关闭文件描述符
客户端:
socket()函数创建流式套接字用于通信
connect()函数建立与服务器的连接
send()/recv()函数读写
close函数关闭文件描述符
10.用过抓包工具么?抓过什么数据包?
Wireshark
tcpdump
https://www.cnblogs.com/jiujuan/p/9017495.html
11. 广播和组播的区别
一、主体不同
1、组播:为了减少在广播中涉及的不必要的开销,可以只向特定的一部分接收方(可以是域内也可以是域间)发送流量。
2、广播:将报文发送到网络中的所有可能的接收者。
二、原理不同
1、组播:在通信中参与或感兴趣的主机需要处理相关的分组,流量只会被承载于它将被使用的链路上,并且只有任意组播数据报的一个副本被承载于这样的链路上。
2、广播:路由器简单地将它接收到的任何广播报文副本转发到除该报文到达的接口以外的每个接口。
三、特点不同
1、组播:通过发送方指明接收方,或是通过接收方独立地指明就可以完成这项工作。然后网络只负责向预期的或感兴趣的收件方发送流量。
2、广播:通过将地址中的主机部分全部置1形成的,特殊地址255.255.255.255对应于本地网络广播。
12. Tcp/Ip网络模型分为几层?每一层什么作用?都有哪些协议?
TCP/IP网络模型分为四层,每一层的作用和常见协议如下:
应用层(Application Layer):
应用协议和应用程序的集合
常见协议:HTTP、FTP、SMTP、DNS、Telnet、SSH、SNMP等。
传输层(Transport Layer):
端到端,决定数据交给机器的哪个任务(进程)去处理,通过端口寻址。
常见协议:TCP(传输控制协议)、UDP(用户数据报协议)。
网络层(Internet Layer):
提供设备对设备的传输,可以理解为通过IP寻址机器。
常见协议:IP、ICMP、IGMP。
网络接口和物理层(Network interfaces and physical layers):
屏蔽硬件差异(驱动),向上层提供统一的操作接口。
常见协议:Ethernet、PPP(Point-to-Point Protocol)、ARP(Address Resolution Protocol)、RARP(Reverse Address Resolution Protocol)。
13. OSI模型?
物理层(Physical Layer):
物理层负责传输比特流,主要定义物理介质和电气特性,以及数据传输的硬件细节。
数据链路层(Data Link Layer):
数据链路层负责将数据包划分成帧,并处理帧的传输和接收。
进行物理地址寻址(MAC地址)和错误检测,确保数据在相邻节点之间可靠传输。
网络层(Network Layer):
网络层负责数据包的路由和转发,实现不同网络之间的数据传输。
进行逻辑地址寻址(IP地址),通过路由算法选择最佳路径将数据包从源节点传输到目的节点。
传输层(Transport Layer):
传输层提供端到端的数据传输服务,确保数据的可靠传输和错误恢复。
提供端口号、流量控制和数据重传等功能,常见的传输层协议有TCP和UDP。
会话层(Session Layer):
会话层负责建立、管理和终止会话(通信连接)。
管理不同设备之间的对话,确保数据传输的顺序和同步。
表示层(Presentation Layer):
表示层负责数据的格式化和转换,确保数据在不同系统中的表示和解释相互兼容。
对数据进行加密、压缩、编码和解码等处理。
应用层(Application Layer):
应用层提供网络应用程序和用户之间的接口,负责应用程序的通信。
各种网络应用,如电子邮件、文件传输、远程登录等都在应用层实现。
14. 学过什么数据库?增删改查语句?
MySQL和SQLite
嵌入式数据库:
MySQL是典型的客户端-服务器架构数据库,需要通过网络连接来访问数据库。它支持多用户、多线程的并发操作,适用于大型应用和高并发场景。
SQLite是一种嵌入式数据库,直接嵌入到应用程序中,不需要独立的服务器进程。它适用于轻量级应用和单用户环境。
数据库大小和性能:
MySQL适用于大型数据库和高性能需求,支持复杂的查询和大规模的数据存储。
SQLite适用于小型数据库和低资源环境,它的存储引擎简单高效,适合移动设备和嵌入式系统。
数据库特性:
MySQL支持完整的SQL语法,包括事务处理、视图、存储过程、触发器等高级特性。
SQLite支持大部分SQL语法,但不支持存储过程和触发器等高级特性。
部署和管理:
MySQL需要单独部署和配置数据库服务器,需要额外的管理和维护工作。
SQLite作为嵌入式数据库,不需要独立的服务器,部署和管理比较简单。
存储引擎:
MySQL支持多种存储引擎,如InnoDB、M0yISAM等,可以根据需求选择不同的存储引擎。
SQLite只有一个存储引擎,但它在大部分场景下性能较好。