网络基础

五层模型

物理层负责把两台计算机连起来,然后在计算机之间传送0,1这样的电信号。

链路层负责给这些0,1制定传送的规则,然后另一方再按照相应的规则来进行解读,比如以太网协议;通过mac地址来在计算机之间传输数据,在同一子网中,当主机A连着多台主机,想给主机B发数据包(包含了接收者的mac,通过arp协议知道的),就会广播出去,各个主机进行比对,相同mac则接受数据

网络层:IP地址被分为两部分,前面一部分代表网络部分,后面一部分代表主机部分。并且网络部分和主机部分的二进制位数是不固定的(通过子网掩码来确定)。网络部分相同就是处于同一子网;arp协议通过广播给子网中的每台电脑发送一个数据包(会包含接收方的IP地址)。接收方会取出IP地址与自身的对比,如果相同,则把自己的MAC地址回复给对方,否则就丢弃这个数据包,计算机A就能知道计算机B的MAC地址了

传输层从计算机A传数据给计算表B的时候,还得指定一个端口,以供特定的应用程序来接受处理。传输层的功能就是建立端口到端口的通信。相比网络层的功能是建立主机到主机的通信

应用层虽然收到了传输层传来的数据,可是这些传过来的数据五花八门,有html格式的,有mp4格式的,各种各样;因此我们需要指定这些数据的格式规则,收到后才好解读渲染。而应用层的功能,就是用来规定应用程序的数据格式的

三次握手

 

四次挥手

 

Socket通信

bind()绑定ip(区分网卡)跟端口(区分应用程序);

listen()将此socket转变为“监听socket”,并监听客户端通过connect()发出连接请求,进行三次握手建立连接

accept()从内核获取客户端的连接,如果没有客户端连接,则会阻塞等待客户端连接的到来,当 TCP 全连接队列不为空后,会拿出一个已经完成连接的 Socket 返回应用程序,这个就是“已连接socket”

多路复用IO

概念单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流.

Selete/poll:将已连接的socket放到一个文件描述符集合(selete是bitmap有大小限制,poll是链表),调用 select 函数将集合拷贝到内核里,遍历文件描述符集合,当检查到有事件产生后,将此 Socket 标记为可读或可写,再把整个文件描述符集合拷贝回用户态里,然后用户态还需要再通过遍历的方法找到可读或可写的 Socket;只支持水平触发模式

Epoll:把需要监控的 socket 通过 epoll_ctl() 函数加入内核中的红黑树里,当某个 socket 有事件发生时,通过回调函数会将其加入到就绪事件链表中,当用户调用 epoll_wait() 函数时,只会返回有事件发生的文件描述符的个数;支持边缘/水平触发

驱动架构

各个协议层在 struct sk_buff中添加自己的协议头,打包好以后都通过 dev_queue_xmit 函数将数据发送出去

 

 接收数据的话使用 netif_rx 函数即可

 

posted on 2022-03-08 22:11  lzd626  阅读(54)  评论(0编辑  收藏  举报