1.请你分别划分OSI的七层网络结构图,和TCP/IP的五层结构图?
TCP/IP 四层模型是现行普适的网络层次模型。由顶层到底层是:
-
应用层:
-
包含 OSI 模型中的最顶部三层,加密、压缩、编码、会话、语义等等功能统统是应用程序 APP 所辖范畴。
-
应用程序 APP 可以很简单,也可以很复杂。
-
-
传输层(位与操作系统内核):
-
与 OSI 模型对应,负责传输控制。
-
-
网络层(位与操作系统内核):
-
与 OSI 模型对应,负责路由选择。
-
-
网络接口与物理层(位与操作系统内核):
-
这包括实际数据传输的物理媒介,及其对应的驱动层软件。
-
2.请你详细的解释一下IP协议的定义,在那个层面上面,主要有什么作用?TCP与UDP呢?
IP协议(Internet Protocol)又称互联网协议,是支持网间互连的数据报协议,它与TCP协议(传输控制协议)一起构成了TCP/IP协议族的核心。它提供网间连接的完善功能,包括IP数据报规定互连网络范围内的IP地址格式。
IP是网络层协议,工作在数据链路层的上面。
IP协议的作用就是向传输层(TCP层)提供统一的IP包,即将各种不同类型的MAC帧转换为统一的IP包,并将MAC帧的物理地址变换为全网统一的逻辑地址(IP地址)。
这样,这些不同物理网络MAC帧的差异对上层而言就不复存在了。正因为这一转换,才实现了不同类型物理网络的互联。
TCP和UDP都是传输层协议.
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,
在收发数据前,必须和对方建立连接。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。
它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。
3.请问交换机和路由器分别的实现原理是什么?分别在那个层次上面实现?
交换机用于局域网,利用主机的MAC 地址进行数据传输,而不需要关心IP 数据包中的IP 地址,它工作于数据链路层。
路由器识别网络是通过IP 数据包中IP 地址的网络号进行的,所以为了保证数据包路由的正确性,每个网络都必须有一个唯一的网络号。
路由器通过IP 数据包的IP 地址进行路由的(将数据包递交给哪个下一跳路由器)。路由器工作于网络层。
由于设备现在的发展,现在很多设备既具有交换又具有路由功能,两者的界限越来越模糊。
4.网络编程如何解决粘包问题?
什么是数据黏包:
在网络编程中,数据粘包(Packet Concatenation)是指在发送过程中,多个数据包可能被合并为一个大的数据包,或者在接收过程中,一个大的数据包被拆分为多个小的数据包。
C# 可以通过以下方法处理数据粘包:
定长包头:在发送数据时,先发送一个固定长度的包头,包头中包含数据长度等信息,接收端收到包头后,先解析出包头中的信息,再按照数据长度接收数据。这种方法虽然能够解决数据粘包问题,但是会浪费一定的带宽。
分隔符:在发送数据时,使用一个特定的分隔符将不同的数据包分开,接收端通过分隔符识别不同的数据包。这种方法比定长包头更灵活,但是分隔符不能出现在数据本身中,否则就会出现错误。
消息结束标志:在发送数据时,在每个数据包的结尾添加一个特定的标志,接收端通过检测该标志识别数据包的结束。这种方法比定长包头和分隔符更灵活,但是需要保证消息结束标志在数据中不会出现。
基于长度的协议:在发送数据时,先发送一个固定长度的包头,包头中包含数据长度等信息,接收端根据包头中的长度信息接收数据。这种方法既能够解决数据粘包问题,又不会浪费带宽,是一种较为常用的处理数据粘包的方法。
5.socket如何解决断点续传问题?
1. 获取上次传输的数据大小:在客户端和服务端建立连接之前,客户端需要先获取服务器上次传输的数据大小。客户端通过向服务器发送一个特殊请求(如“GET /file_size”),服务器则会响应请求并返回已经传输的数据大小。
2. 设置传输起始位置和结束位置:在获取到上次传输的数据大小后,客户端需要按照该大小来设置传输的起始位置和结束位置,这样可以避免重复传输已经传输过的数据。客户端发送的请求中需要包含传输区间的起始位置和结束位置(如“GET /filename HTTP/1.1\r\nRange: bytes=start-end\r\n”),服务器则会根据请求中的范围返回数据。
3. 传输过程中发生中断时如何处理:如果在传输过程中发生中断(如网络故障、程序异常等),客户端需要记录下已经传输的数据大小,以便在下次恢复传输时从该位置开始传输。当再次连接服务器时,客户端需要向服务器发送一个特殊请求(如“GET /resume”),该请求包含上次传输的数据大小等相关信息,服务器则会响应请求并返回剩余部分的数据。
4. 整个文件传输完成后如何处理:当整个文件传输完毕后,服务器需要通知客户端传输已经完成,并可以关闭连接。为了保证文件传输的完整性,客户端可以向服务器发送一个确认请求(如“GET /confirm”),服务器则会响应确认请求并返回确认信息。
6.三次握手和四次挥手如何实现的?https://blog.csdn.net/xiaojin21cen/article/details/79512814
三次握手,建立连接
- 第一次握手: 建立连接时,客户端 发送 SYN包 到 服务器,并且,客户端 进入
SYN_SEND
状态,等待 服务器 确认; - 第二次握手: 服务器 收到 SYN包 后,同时,发送一个 SYN+ACK包 给 客户端 ,此时,服务器进入
SYN_RECV
状态; - 第三次握手: 客户端 收到服务器的 SYN+ACK包 后,向 服务器 发送确认的 ACK包 。此包发送完毕,客户端 和 服务器 进入
ESTABLISHED
状态,完成三次握手。
四次挥手,断开连接
-
第1次挥手:主动关闭方 向 被动关闭方 发送一个 FIN包 。也就是主动关闭方 告诉 被动关闭方 :我已经不会再给你发数据了。
-
第2次挥手:被动关闭方 收到 FIN包 后,发送一个 ACK包 给 主动关闭方 。 就告诉 主动关闭方 已收到通知 。
(在 被动关闭方 发送 FIN包 之前,被动关闭方 还是可以向 主动关闭方 发送数据的。)
-
第3次挥手:被动关闭方 又发送一个 FIN包,给 主动关闭方,用来关闭 被动关闭方 到 主动关闭方 的数据传送。
也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。 -
第4次挥手:主动关闭方 收到 FIN包后,发送一个 ACK包 给 被动关闭方 ,至此,完成四次挥手。
说明: 第2次和第3次, 被动关闭方 连续两次向 主动关闭方 发送报文
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认。服务器收到syn包,必须确认客户的SYN(ack=x+1),此时,服务器确认,客户端发送能力正常,服务端接收能力正常。
第二次握手:服务器同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;客户端收到服务器的SYN+ACK包。此时,客户端确认:服务端接收和发送能力正常,客户端发送和接受能力正常。
第三次握手:客户端同时向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。此时,服务器确认,客户端发送和接收能力正常,服务端接收和发送能力正常。
第一次挥手 客户端发送FIN给服务器,客户端状态由 ESTABLISHED 变为 FIN_WAIT_1。
第二次挥手 服务器收到FIN且发送ACK给客户端,服务器状态由 ESTABLISHED 变CLOSE_WAIT。 服务器将缓存中没发送完的数据继续发送给客户端 客户端收到ACK后状态由FIN_WAIT_1变为FIN_WAIT_2。
第三次挥手 服务器发送FIN给客户端,这时服务器的状态由CLOSE_WAIT变为 LAST_ACK。
第四次挥手 客户端收到FIN后返回ACK给服务器,然后客户端的状态由FIN_WAIT_2变为TIME_WAIT,TIME_WAIT = 2MSL (maximum segement lifetime 分节在网络中最长生存时间,30秒到2分钟,根据系统实现不同而不同) 2MSL 范围是 1分钟到4分钟。 服务器收到ACK后,状态由LAST_ACK变为CLOSED。 而客户端再经过TIME_WAIT时间后变为CLOSED状态。
7.IO多路复用
一、什么是多路复用:
- 多路: 指的是多个socket网络连接;
- 复用: 指的是复用一个线程、使用一个线程来检查多个文件描述符(Socket)的就绪状态
- 多路复用主要有三种技术:select,poll,epoll。epoll是最新的, 也是目前最好的多路复用技术;
select
-
select:select 是最古老的IO多路复用机制,使用fd_set集合来管理被监听的文件描述符。它的特点包括:
- 跨平台支持:select 在几乎所有的操作系统上都得到支持,包括UNIX、Linux、Windows等。
- 限制:select 集合的大小有限制,通常是1024,这可能限制了同时监听的文件描述符数量。
- 遍历开销:每次调用 select 都需要遍历整个文件描述符集合,因此对于大量的文件描述符会带来一定的开销。
- select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds
-
poll:poll 是对 select 的改进,它使用一个结构数组来管理被监听的文件描述符。poll 的特点包括:
- 跨平台支持:和 select 一样,poll 也在多个操作系统上得到支持。
- 没有限制:poll 没有像 select 那样有文件描述符数量的限制,因此可以支持更多的文件描述符。
- 遍历开销:和 select 类似,每次调用 poll 也需要遍历整个文件描述符数组,对于大量的文件描述符仍然会有一定的开销。
-
epoll:epoll 是Linux特有的IO多路复用机制,使用事件驱动的方式来管理被监听的文件描述符。epoll 的特点包括:
- 高效的事件通知:epoll 采用了与文件描述符数量无关的事件驱动方式,只会通知发生变化的文件描述符,因此具有较低的开销。
- 大规模扩展:epoll 可以支持大规模的并发连接,它使用一个红黑树来管理被监听的文件描述符,以快速检索和处理事件。
- 支持不同的工作模式:epoll 提供了三种工作模式:水平触发(Level Triggered)、边缘触发(Edge Triggered)和一次性触发(One-shot),具有更灵活的事件处理能力。