首页
前端面试题
前端报错总结
电子书
更多
插件下载
Search
1
JavaScript基础(二)操作符 流程控制
42 阅读
2
HTML基础
20 阅读
3
Vue基础
17 阅读
4
wctype.h
14 阅读
5
Vue2(知识点)
13 阅读
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
登录
Search
liuxiaobai
累计撰写
108
篇文章
累计收到
12
条评论
首页
栏目
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
页面
前端面试题
前端报错总结
电子书
插件下载
搜索到
104
篇与
的结果
2024-12-12
tcpip 协议栈知识点
目录tcpip模型以太网协议ARP地址解析协议TCP协议tcpip模型 OSI模型 linux tcpip模型 常用协议 网络设备 应用层 application 应用层 telnet/DHCP/TFTP/FTP/MQTT/NFS/DNS/FTP/SNMP 表示层 presentation 会话层 session 传输层 transport 传输层 TCP/UDP 四层交换机 网络层 网络层 Network IP/ICMP/IGMP/ARP 路由器,三层交换机 数据链路层 Datalink 网络接口层 Ethernet/PPP/PPPoE 交换机(二层交换机),网桥,网卡(一半物理层,一半链路层) 物理层 physcial 中继器、集线器 以太网协议 前导码 SFD 目标地址 源地址 长度/类型 数据 CRC校验 7字节 1字节 6字节 6字节 2字节 46~1500字节 4字节 前导码和SFD: 不能算是以太网数据帧,是以太网在物理层上发送以太网数据时添加上去的。长度/类型: 大于1518,表示该以太网帧中的数据属于哪个上层协议(0x0800:IP数据包;0x0806:ARP数据包)单播地址、组播地址: 第一个字节的bit0为0代表单播地址,为1代表组播地址。ARP地址解析协议 以太网首部 硬件类型 协议类型 MAC地址长度 协议地址长度 OP 源MAC地址 源IP地址 目标MAC地址 目标IP地址 14字节 2字节 2字节 1字节 1字节 2字节 6字节 4字节 6字节 4字节 MAC地址长度和IP地址长度: 分别为6和4.OP:ARP请求(值为1)、ARP应答(值为2)。IP地址分类IP地址=网络地址+主机地址分类开头第一个字节范围总体范围掩码地址说明A类01~1261.0.0.0 - 126.255.255.255255.0.0.0给规模特别大的网络使用B类10128~191128.0.0.0 - 191.255.255.255255.255.0.0给一般的中型网络C类110192~223192.0.0.0 - 223.255.255.255255.255.255.0给小型网络D类1110224~239224.0.0.0 - 239.255.255.255-用于多点广播(组播)E类11110240~255240.0.0.0 - 255.255.255.255-用于广播地址其他:主机号全为0表示本网络本身 主机号全为1表示本网络广播地址127.0.0.0 环路自检地址,表示任意主机本身0.0.0.0 表示本网络的本主机专用地址: A类:10.0.0.0—10.255.255.255,B类:172.16.0.0—172.31.255.255,C类:192.168.0.0—192.168.255.255。IP地址与子网掩码相与得到网络号TCP与UDP的区别TCPUDP面向连接,需要三次握手,4次挥手不需要建立连接无差错,不丢失,不重复,且按序到达不保证数据可靠、按序到达面向字节流面向报文有拥塞控制,不会使源主机的发送速率降低没有拥塞控制连接只能是点到点支持一对一,一对多,多对一和多对多的交互通信首部开销20字节首部开销小,只有8个字节ftp telnet http https SMTP POP3DNS DHCP tftp IGMP RTPICMP协议ICMP允许主机或路由报告差错情况和提供有关异常情况ICMP是因特网的标准协议,属于IP层的协议。ping包同一个局域网中:Pc1在应用层发起个目标IP位IP2的Ping请求。传输层接到上层请求的数据,将数据分段并加上UDP报头。下传到Internet层。网际层接收来处上层的数据后,根据ICMP协议进行封装,添加PC1的IP为源IP为和PC2IP为目标IP后封装成数据包。下传到网络接口层。网络接口层接收数据包后,进行封装,源MAC地址为PC1的MAC地址,目标MAC地址则查询自己的ARP缓存表获取。如果PC1 arp缓存表中没有目标IP对应的MAC地址,则PC1发出一个ARP广播报文。ARP报文中源MAC地址为Pc1mac地址,源IP地址为pc1 IP,所要请求的是PC2的IP对应的mac地址。PC2收到ARP广播后,进行解封装,发现所请求的MAC地址是自己的。则PC2将PC1的mac地址写入arp缓存表中。然后向PC1发送一个 ARP应答单播。该单播消息包括目标IP为PC1ip,目标Mac为pc1mac地址,源IP为PC2的IP,源Mac为pc2的Mac。Pc1接收到PC2的arp应答报文后,将Pc2的MAC地址存入arp缓存中,并将Pc2的Mac地址作为目标地址封装到数据帧中。发给下层进行网络传输。PC2接收这个帧后,在网络接口层查看目标mac地址是否指向自己。是,PC2则将帧头去掉,向上层传输。Pc2网际层接收到这个信息包,查看包头,发现目标IP和自己匹配,则解封装,将数据向上层传输。传输层接收来自下层的Ping请求的UDP报文,则去掉UDP报头,向应用层传送。应用层收到ping请求后,发送一个PIng回应报文给PC1TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用三次握手第一次握手:客户机首先向服务器的TCP发送一个连接请求报文段,这个特殊的报文段不含应用层数据,其首部中同步位SYN被设置为1。另外,客户机会随机选择一个起始序号seq=x(连接请求报文不携带数据,但要消耗一个序号).第二次握手:服务器的TCP收到连接请求报文段后,如果同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被设置为1,确认号字段值为ack=x+1,并且服务器随机产生起始序号seq=y. 确认包同样不包含应用层数据。第三次握手:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的确认为ACK被设置为1,序号段被设置为seq=x+1,确认号字段ack=y+1. 该报文段可以携带数据,如果不携带数据则不消耗序号。 理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。因为TCP提供全双工通信,因此双方任何时候都可以发送数据。四次挥手第一次挥手:客户机打算关闭连接,就向其TCP发送一个连接释放报文,并停止再发送数据,主动关闭TCP连接。该报文段的FIN标志位被设置为1,seq=u,它等于前面已经发送过的数据的最后一个字节的序号加1。第二次挥手:服务器收到连接释放报文段后即发出确认,确认号是ack=u+1,序号为v,等于它前面已经发送过的数据的最后一个字节序号加1.此时客户机到服务器这个方向的连接就释放了,TCP处于半关闭状态。ACK=1,seq=v,ack=u+1第三次挥手:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时发出FIN=1,确认号ack= u+1,序号seq =w,已经发送过的数据最后一个字节加1。确认为ACK=1. (FIN = 1, ACK=1,seq = w, ack =u+1) 第四次挥手:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,确认位ACK=1,序号seq=u+1,确认号ack=w+1. 此时连接还没有释放掉,必须经过实践等待计时器设置的时间2MSL(Max Segment Lifetime),后,客户机才进入连接关闭状态。 (ACK=1,seq=u+1,ack=w+1)如下图所示:tcp协议图解为什么会采用三次握手,若采用二次握手可以吗?采用三次握手是为了防止失效的连接请求报文段再次传到服务器,因而产生错误。如果由于网络不稳定,虽然客户端以前发送的连接请求以到达服务方,但服务方的同意连接的应答未能到达客户端。则客户方要重新发送连接请求,若采用二次握手,服务方收到客服端重传的请求连接后,会以为是新的请求,就会发送同意连接报文,并新开进程提供服务,这样会造成服务方资源的无谓浪费。 如果只采用一次的话,客户端不知道服务端是否已经收到自己发送的数据,则会不断地发送数据。为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手为什么四次挥手,主动方要等待2MSL后才关闭连接.一、保证TCP协议的全双工连接能够可靠关闭. 主要为了确保对方能受到ACK信息. 如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。所以,Client不是直接进入CLOSED,而是要保持2MSL,如果在这个时间内又收到了server的关闭请求时可以进行重传,否则说明server已经受到确认包则可以关闭.TCP拥塞控制为了更好对TCP进行拥塞控制,因特网建议标准定义了以下四种算法:慢开始,拥塞避免,快重传,快恢复。 首先在TCP要求发送端维护两个窗口: 1) 接收窗口rwnd,接收方根据当前缓存大小锁许诺的最新窗口值。 2) 拥塞窗口 cwnd ,发送方根据自己估算的网络拥塞程度而设置的窗口值。 发送窗口的上限是取这两者的最小值。 慢开始: TCP刚连接好时,先令拥塞窗口cwnd =1 ,在每次收到一个对新报文段的确认时将cwnd加1. Cwnd的大小呈指数增长。 拥塞避免算法: 当cwnd大于等于慢开始门限ssthresh时,cwnd窗口每次加1而不是加倍。当发送方检测到超时事件的发生时,就将慢开始门限设置为当前cwnd的一半,同时将cwnd设置为1. 这样的目的是迅速减少主机发送到网络的分组数,使得发生拥塞的路由器有足够的时间吧队列中积压的分组处理完毕。 快重传:当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。 快恢复:当发送端收到连续三个冗余的ACK时,就执行“乘法减小”算法,把慢开始门限ssthresh减半,cwnd设置为慢开始门限减半后的数值(与慢开始不同)。TCP滑动窗口与回退N针协议滑动窗口: 发送方都维持一组连续的允许发送的帧的序号称为发送窗口。同时接收方也维持一组连续的允许接收的帧序号,称为接收窗口。发送窗口是用来对发送方进行流量控制,接收窗口是用来控制接收那些数据帧不可以接收那些帧。 在发送端,收到一个确认帧,发送窗口就向前滑动一个帧位置,当发送窗口没有可以发送的帧时,发送方就停止发送。直到接收方发送的确认帧使发送窗口向前移动。 在接收端,只有收到数据帧的序号落在接收窗口内才将该帧收下,否则一律丢弃。每收到一个帧后就发送回确认帧。后退N帧协议 发送窗口大于1,接收窗口等于1.在后退N帧中,发送方不需要收到上一帧的ACK后才能发送下一帧,而是可以连续发送帧。当接收方检测出失序信息帧后,要求发送方重发最后一个正确接收的帧之后的所有未被确认的帧。源站每发完一帧就要为该帧设置超时计时器,如果在超时时间内没有收到确认帧则进行重发。服务端会采用累积确认的方式,不是每个帧都发确认,可以连续收到好几个正确帧后发回一个确认信息。接收方因为窗口为1,所以必须按序接收数据帧,如果某个序大于当前所期望的序号时就会连续发送3个ACK确认帧,要求客户端重传失序帧。TCP的可靠性如何保证在TCP的连接中,数据流必须以正确的顺序送达对方。TCP的可靠性是通过顺序编号和确认(ACK)来实现的。TCP在开始传送一个段时,为准备重传而首先将该段插入到发送队列之中,同时启动时钟。其后,如果收到了接受端对该段的ACK信息,就将该段从队列中删去。如果在时钟规定的时间内,ACK未返回,那么就从发送队列中再次送出这个段。TCP在协议中就对数据可靠传输做了保障,握手与断开都需要通讯双方确认,数据传输也需要双方确认成功,在协议中还规定了:分包、重组、重传等规则;而UDP主要是面向不可靠连接的,不能保证数据正确到达目的地。各种协议对应的传输层协议Ethernet应用IPICMPUDPTCPSCIPping ● traceroute ●● OSPF(路由协议)● RIP(路由协议) ● BGP(路由协议) ● BOOTP(引导协议) ● DHCP ● NTP(时间协议) ● TFTP(低级FTP) ● SNMP(网络管理) ● IGMP(组播管理) ● SMTP(电子邮件) ● telnet(远程登录) ● SSH(安全远程登录) ● FTP(文件传输) ● HTTP(web) ● NNTP(网络新闻) ● LPR(远程打印) ● DNS(域名系统) ●● NFS(网络文件系统) ●● Sun RPC(远程过程调用) ●● DCE RPC(远程过程调用) ●● IUA(ISDN) ●M2UA/M3UA(SS7电话信令) ●H.248(媒体网关控制) ●●●H.323(IP电话) ●●●H.248(IP电话) ●●●MQTT协议https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/04-OperationalBehavior.htmlMQTT有3种网络连接方式tcp(1883端口) TLS(8883端口) websocket主题过滤器 Topic Filter订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。控制报文 MQTT Control Packet通过网络连接发送的信息数据包。MQTT规范定义了十四种不同类型的控制报文名字 值 报文流动方向 描述Reserved 0 禁止 保留CONNECT 1 客户端到服务端 客户端请求连接服务端CONNACK 2 服务端到客户端 连接报文确认PUBLISH 3 两个方向都允许 发布消息PUBACK 4 两个方向都允许 QoS 1消息发布收到确认PUBREC 5 两个方向都允许 发布收到(保证交付第一步)PUBREL 6 两个方向都允许 发布释放(保证交付第二步)PUBCOMP 7 两个方向都允许 QoS 2消息发布完成(保证交互第三步)SUBSCRIBE 8 客户端到服务端 客户端订阅请求SUBACK 9 服务端到客户端 订阅请求报文确认UNSUBSCRIBE 10 客户端到服务端 客户端取消订阅请求UNSUBACK 11 服务端到客户端 取消订阅报文确认PINGREQ 12 客户端到服务端 心跳请求PINGRESP 13 服务端到客户端 心跳响应DISCONNECT 14 客户端到服务端 客户端断开连接Reserved 15 禁止 保留大端模式MQTT数据格式使用大端模式存放MQTT控制报文结构 固定报头 可变报头 payload 固定报头总共是2-5个字节第1个字节 7 6 5 4 3 2 1 0 表示控制报文类型 表示控制报文类型的标志位 第2-5字节 剩余长度 表示当前报文剩余部分的字节数,包括可变报头和payload的数据。剩余长度剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。更大的值按下面的方式处理。低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。因此每个字节可以编码128个数值和一个延续位(continuation bit)剩余长度字段最大4个字节。 字节数最小值最大值10 (0x00)127 (0x7F)2128 (0x80, 0x01)16383 (0xFF, 0x7F)316 384 (0x80, 0x80, 0x01)2097151 (0xFF, 0xFF, 0x7F)42 097 152 (0x80, 0x80, 0x80, 0x01)268435455 (0xFF, 0xFF, 0xFF, 0x7F)变长编码方案代码:do encodedByte = X MOD 128 X = X DIV 128 // if there are more data to encode, set the top bit of this byte if ( X > 0 ) encodedByte = encodedByte OR 128 endif 'output' encodedByte while ( X > 0 )变长解码方案代码:multiplier = 1 value = 0 do encodedByte = 'next byte from stream' value += (encodedByte AND 127) * multiplier multiplier *= 128 if (multiplier > 128*128*128) throw Error(Malformed Remaining Length) while ((encodedByte AND 128) != 0)可变报头 Variable header某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。报文标识符 Packet Identifier很多控制报文的可变报头部分包含一个两字节的报文标识符字段。这些报文是PUBLISH(QoS > 0时), PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCIBE,UNSUBACK。SUBSCRIBE,UNSUBSCRIBE和PUBLISH(QoS大于0)控制报文必须包含一个非零的16位报文标识符(Packet Identifier)。客户端每次发送一个新的这些类型的报文时都必须分配一个当前未使用的报文标识符。如果一个客户端要重发这个特殊的控制报文,在随后重发那个报文时,它必须使用相同的标识符。当客户端处理完这个报文对应的确认后,这个报文标识符就释放可重用。QoS 1的PUBLISH对应的是PUBACK,QoS 2的PUBLISH对应的是PUBCOMP,与SUBSCRIBE或UNSUBSCRIBE对应的分别是SUBACK或UNSUBACK。发送一个QoS 0的PUBLISH报文时,相同的条件也适用于服务端。QoS等于0的PUBLISH报文不能包含报文标识符。PUBACK, PUBREC, PUBREL报文必须包含与最初发送的PUBLISH报文相同的报文标识符。类似地,SUBACK和UNSUBACK必须包含在对应的SUBSCRIBE和UNSUBSCRIBE报文中使用的报文标识符。payload某些MQTT控制报文在报文的最后部分包含一个有效载荷对于PUBLISH来说有效载荷就是应用消息。控制报文有效载荷CONNECT需要CONNACK不需要PUBLISH可选PUBACK不需要PUBREC不需要PUBREL不需要PUBCOMP不需要SUBSCRIBE需要SUBACK需要UNSUBSCRIBE需要UNSUBACK不需要PINGREQ不需要PINGRESP不需要DISCONNECT不需要HTTP协议RSPHTTP请求方法HTTP协议永远都是客户端发起请求,服务器回送响应。GET 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。PUT 向指定资源位置上传其最新内容。POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。DELETE 请求服务器删除Request-URI所标识的资源。TRACE 回显服务器收到的请求,主要用于测试或诊断。CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。HTTP 状态码1** 请求收到,继续处理100——客户必须继续发出请求101——客户要求服务器根据请求转换HTTP协议版本2** 操作成功收到,分析、接受200——交易成功201——提示知道新文件的URL202——接受和处理、但处理未完成203——返回信息不确定或不完整204——请求收到,但返回信息为空205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件206——服务器已经完成了部分用户的GET请求3** 完成此请求必须进一步处理300——请求的资源可在多处得到301——删除请求数据302——在其他地址发现了请求数据303——建议客户访问其他URL或访问方式304——客户端已经执行了GET,但文件未变化305——请求的资源必须从服务器指定的地址得到306——前一版本HTTP中使用的代码,现行版本中不再使用307——申明请求的资源临时性删除4** 请求包含一个错误语法或不能完成400——错误请求,如语法错误401——未授权 HTTP 401.1 - 未授权:登录失败 HTTP 401.2 - 未授权:服务器配置问题导致登录失败 HTTP 401.3 - ACL 禁止访问资源 HTTP 401.4 - 未授权:授权被筛选器拒绝 HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败402——保留有效ChargeTo头响应403——禁止访问 HTTP 403.1 禁止访问:禁止可执行访问 HTTP 403.2 - 禁止访问:禁止读访问 HTTP 403.3 - 禁止访问:禁止写访问 HTTP 403.4 - 禁止访问:要求 SSL HTTP 403.5 - 禁止访问:要求 SSL 128 HTTP 403.6 - 禁止访问:IP 地址被拒绝 HTTP 403.7 - 禁止访问:要求客户证书 HTTP 403.8 - 禁止访问:禁止站点访问 HTTP 403.9 - 禁止访问:连接的用户过多 HTTP 403.10 - 禁止访问:配置无效 HTTP 403.11 - 禁止访问:密码更改 HTTP 403.12 - 禁止访问:映射器拒绝访问 HTTP 403.13 - 禁止访问:客户证书已被吊销 HTTP 403.15 - 禁止访问:客户访问许可过多 HTTP 403.16 - 禁止访问:客户证书不可信或者无效 HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效404——没有发现文件、查询或URl405——用户在Request-Line字段定义的方法不允许406——根据用户发送的Accept拖,请求资源不可访问407——类似401,用户必须首先在代理服务器上得到授权408——客户端没有在用户指定的饿时间内完成请求409——对当前资源状态,请求不能完成410——服务器上不再有此资源且无进一步的参考地址411——服务器拒绝用户定义的Content-Length属性请求412——一个或多个请求头字段在当前请求中错误413——请求的资源大于服务器允许的大小414——请求的资源URL长于服务器允许的长度415——请求资源不支持请求项目格式416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。5** 服务器执行一个完全有效请求失败 HTTP 500 - 内部服务器错误 HTTP 500.100 - 内部服务器错误 - ASP 错误 HTTP 500-11 服务器关闭 HTTP 500-12 应用程序重新启动 HTTP 500-13 - 服务器太忙 HTTP 500-14 - 应用程序无效 HTTP 500-15 - 不允许请求 global.asaError 501 - 未实现 HTTP 502 - 网关错误长连接 短连接HTTP 1.0 使用短连接HTTP 1.1版本默认使用长连接HTTP 请求消息格式请求行通用信息头|请求头|实体头CRLF(回车换行)比如:GET /hello.htm HTTP/1.1 Accept: */* Accept-Language: zh-cn Accept-Encoding: gzip, deflate If-Modified-Since: Wed, 17 Oct 2007 02:15:55 GMT If-None-Match: W/"158-1192587355000" User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) Host: 192.168.2.162:8080 Connection: Keep-AliveHTTP 响应消息格式状态行通用信息头|响应头|实体头CRLFHTTP/1.1 200 OK ETag: W/"158-1192590101000" Last-Modified: Wed, 17 Oct 2007 03:01:41 GMT Content-Type: text/html Content-Length: 158 Date: Wed, 17 Oct 2007 03:01:59 GMT Server: Apache-Coyote/1.1HTTP post发送文件使用post方法发送文件内容HTTP用户名密码机制使用cookie的方式:登录成功后用javascript调用cookie的相关接口,创建一个浏览器上的全局变量,变量名和值由你自己约定,然后每个页面载入时检查cookie是否存在,其值是否为你默认的那个值,如果不是的话就跳转到登录页面。HTTPS的通信过程HTTPS、SSH 公钥、秘钥、对称加密、非对称加密、hash算法非对称加密: DES 秘钥长度为56bit AES 秘钥长度支持128 196 256非对称加密: DSA 用于数字签名和认证中。和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多,DSA只能与SHA-1一起使用,而RSA可以与任何摘要算法一起使用。DSA主要依赖于整数有限域离散对数难题。HASH算法: MD5 SHA1 SHA256DSA 用于签名,而 RSA 可用于签名和加密。数字签名和数字证书数字签名服务器把发送内容用hash算法生成摘要(就是校验码),然后用私钥加密这个摘要,就是数字签名。数字证书证书中心把服务器的公钥和一些其他的必要信息通过证书中心的私钥加密生成一个证书,服务器每次把数字签名,内容,数字证书一起发送给客户端,客户端用证书中心的公钥验证数字证书是不是可信任的就可以了。websocketWebSocket协议支持客户端与远程主机之间进行全双工通信。协议标识符是ws(如果加密,则为wss),服务器网址就是 URL,比如:ws://example.com:80/some/path`websocket握手协议浏览器请求GET /webfin/websocket/ HTTP/1.1 Host: localhost Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg== Origin: http://服务器地址 Sec-WebSocket-Version: 13WebSocket借用http请求进行握手,相比正常的http请求,多了一些内容。其中,Upgrade: websocketConnection: Upgrade表示希望将http协议升级到Websocket协议。Sec-WebSocket-Key是浏览器随机生成的base64 encode的值,用来询问服务器是否是支持WebSocket。服务器回应HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=服务器返回Upgrade: websocketConnection: Upgrade告诉浏览器即将升级的是Websocket协议HTML5 Web Socket API创建对象var ws = new WebSocket(url,name); // url为WebSocket服务器的地址,name为发起握手的协议名称,为可选择项。发送文本消息ws.send(msg); // msg为文本消息,对于其他类型的可以通过二进制形式发送。接收消息ws.onmessage = (function(){...})();错误处理ws.onerror = (function(){...})();关闭连接ws.close();coapHTTP 与 COAP协议都是通过4个请求方法(GET, PUT, POST, DELETE)对服务器端资源进行操作。 两者之间明显的区别在于HTTP是通过文本描述方式描述协议包内容,协议包里面会包含一些空格符,换行符等,协议包可读性很强。而COAP是通过定义二进制各位段功能来描述协议包内容。 因此COAP协议包大小更小,更紧凑。COAP协议最小的协议包只有4B。 协议包需要经过解析后才能知道里面具体内容coap 特点二进制通讯对云端设备资源操作都是通过请求与响应机制来完成,类似HTTP,设备端可通过4个请求方法(GET, PUT, POST, DELETE)对服务器端资源进行操作。协议包轻量级,最小长度仅为4B。支持可靠传输,数据重传,块传输。 确保数据可靠到达。支持IP多播, 即可以同时向多个设备发送请求非长连接通信,适用于低功耗物联网场景协议结构coap基于UDP之上UDP--->Messages--->request/response--->payloadnb-iotfreertosalios-thingsmeos
2024年12月12日
5 阅读
0 评论
0 点赞
2024-12-12
freertos 源码详解
目录简单的任务函数void ATaskFunction( void *pvParameters ) { int iVariableExample = 0; /* 任务通常实现在一个死循环中。 */ for( ;; ) { /* 完成任务功能的代码将放在这里。 */ } /* 如果任务的具体实现会跳出上面的死循环,则此任务必须在函数运行完之前删除。传入NULL参数表示删除的是当前任务 */ vTaskDelete( NULL ); }创建任务函数/* 函数原型 */ portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, const signed portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask ); /* 函数示例 */ static TaskHandle_t myTaskHandler = NULL; xTaskCreate(ATaskFunction, "myTask", 512, NULL, configMAX_PRIORITIES - 4, &myTaskHandler);删除任务函数/* 函数原型 */ void vTaskDelete( xTaskHandle pxTaskToDelete );任务优先级低优先级号表示任务的优先级低,优先级号0表示最低优先级。有效的优先级号范围从0到(configMAX_PRIORITES – 1)。函数说明vTaskPrioritySet()可以动态的更改任务优先级uxTaskPriorityGet()获取任务优先级uxTaskPriorityGetFromISR()在ISR函数中获取任务优先级延时函数void vTaskDelay( portTickType xTicksToDelay );xTicksToDelay 表示延时多少个tick \该函数会把task切出到阻塞态精确延时函数void vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement );调用此函数的任务解除阻塞的时间是绝对时刻,比起vTaskDelay()延时时间更精确使用方法:void vTaskFunction( void *pvParameters ) { char *pcTaskName; portTickType xLastWakeTime; pcTaskName = ( char * ) pvParameters; /* 变量xLastWakeTime需要被初始化为当前心跳计数值。说明一下,这是该变量唯一一次被显式赋值。之后, xLastWakeTime将在函数vTaskDelayUntil()中自动更新。 */ xLastWakeTime = xTaskGetTickCount(); for( ;; ) { vPrintString( pcTaskName ); /* 本任务将精确的以250毫秒为周期执行。同vTaskDelay()函数一样,时间值是以心跳周期为单位的, 可以使用常量portTICK_RATE_MS将毫秒转换为心跳周期。变量xLastWakeTime会在 vTaskDelayUntil()中自动更新,因此不需要应用程序进行显示更新。 */ vTaskDelayUntil( &xLastWakeTime, ( 250 / portTICK_RATE_MS ) ); } }空闲任务调用vTaskStartScheduler()时,调度器会自动创建一个空闲任务 \空闲任务拥有最低优先级(优先级0) \空闲任务是一个非常短小的循环具体代码在vTaskStartScheduler()中可以看到:void vTaskStartScheduler( void ) { BaseType_t xReturn; /* Add the idle task at the lowest priority. */ #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) { /* Create the idle task, storing its handle in xIdleTaskHandle so it can be returned by the xTaskGetIdleTaskHandle() function. */ xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ } #else { /* Create the idle task without storing its handle. */ xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ } #endif /* INCLUDE_xTaskGetIdleTaskHandle */ ... }队列创建队列xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength,unsigned portBASE_TYPE uxItemSize );写入到队列首portBASE_TYPE xQueueSendToFront( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait );写入到队列尾portBASE_TYPE xQueueSendToBack( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait );发送队列协程--croutine.c系统运行过程协程--croutine.c4个链表:readyList pendingList delayList(2个)链表设计--List.c系统调度任务管理内存管理优先级反转有优先级为A、B和C三个任务,优先级A>B>C,任务A,B处于挂起状态,等待某一事件发生,任务C正在运行,此时任务C开始使用某一共享资源S。在使用中,任务A等待事件到来,任务A转为就绪态,因为它比任务C优先级高,所以立即执行。当任务A要使用共享资源S时,由于其正在被任务C使用,因此任务A被挂起,任务C开始运行。如果此时任务B等待事件到来,则任务B转为就绪态。由于任务B优先级比任务C高,因此任务B开始运行,直到其运行完毕,任务C才开始运行。直到任务C释放共享资源S后,任务A才得以执行。在这种情况下,优先级发生了翻转,任务B先于任务A运行。优先级继承freertos 使用优先级继承来解决优先级反转问题当任务A 申请共享资源S 时, 如果S正在被任务C 使用,通过比较任务C 与自身的优先级,如发现任务C 的优先级小于自身的优先级, 则将任务C的优先级提升到自身的优先级, 任务C 释放资源S 后,再恢复任务C 的原优先级。freertos HOOK函数vApplicationIdleHook() idle的hook函数vApplicationTickHook() 系统tick的hook函数vApplicationMallocFailedHook() malloc失败的hook函数vApplicationStackOverflowHook() 栈溢出的hook函数vApplicationDaemonTaskStartupHook() vTaskStartScheduler()函数第一次执行的时候调用。freertos栈溢出检测的2种方法第一种 每次调度都检查一下任务的当前栈有没有超过任务的栈区域。第二种 每个任务栈最下面会有16个字节是特定的内容,每次调度的时候如果发现这16个字节不正常了,就说明有谁踩到了这个栈。
2024年12月12日
4 阅读
0 评论
0 点赞
2024-12-12
linux知识点
目录关键命令说明系统关机命令linux查看文本的指令mountdmesggrepfindlsusblsoflinux软件开发知识点linux进程间通讯方式内存申请函数gcc编译过程文件系统硬链接和软连接linux内核子系统进程几种状态文件系统组成linux文件类型linux常用的系统调用函数fork函数僵尸进程常见文件说明/proc目录说明fopen参数说明linux驱动开发知识点makefileshell关键命令说明系统关机命令linux查看文本的指令mountdmesggrepfindlsusblsof系统关机命令指令说明shutdown命令安全地将系统关机。halt就是调用shutdown -h。reboot工作过程差不多跟halt一样﹐不过它是引发主机重启poweroff就是halt的软链接而已init所有进程的祖先﹐它的进程号始终为1﹐init 0为关机﹐init1为重启。linux查看文本的指令 cat tac sed head tail more less nl tac: cat的反向指令,从最后一行倒序显示全部内容head: 只显示头几行tail: 只显示最后几行 tail -f 可以实时显示log文件的更新nl: 类似于cat -n,显示时输出行号mount命令格式:mount [-t vfstype] [-o options] device dir挂载nfsmount -t nfs 192.168.0.1:/tmp /mnt/nfs dmesgcat /var/log/messagesgrep选项-c:只输出匹配行的计数。 -C:匹配的上下文分别显示[number]行。 -I:不区分大小写(只适用于单字符)。 -i:不区分大小写。 -h:查询多文件时不显示文件名。 -l:查询多文件时只输出包含匹配字符的文件名。 -L:列出不匹配的文件名。 -n:显示匹配行及 行号。 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 -w:只匹配整个单词。 -E:扩展的正则表达式 -R:递归搜寻 --exclude=FILE:跳过FILE正则表达式主要参数:\:忽略正则表达式中特殊字符的原有含义。 ^:匹配正则表达式的开始行。 $:匹配正则表达式的结束行。 \<:从匹配正则表达式的行开始。 \>:到匹配正则表达式的行结束。 []:单个字符,如[A]即A符合要求 。 [-]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 .:所有的单个字符。 *:有字符,长度可以为0。 经典使用方法#所有以d开头的文件,包含test的匹配行 grep "test" d* #包含test或者zephyr 不区分大小写 显示行号 扩展正则表达式 grep -inE "test|zephyr" d* #包含test和zephyr 不区分大小写 显示行号 扩展正则表达式 grep -in "test" d* | grep 'zephyr'主要参数:-c:只输出匹配行的计数。 -I:不区分大小写(只适用于单字符)。 -h:查询多文件时不显示文件名。 -l:查询多文件时只输出包含匹配字符的文件名。 -L:列出不匹配的文件名 -n:显示匹配行及行号。 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 -R:递归搜寻 -d skip:不递归搜寻 -w:匹配整个单词正则表达式主要参数:\:忽略正则表达式中特殊字符的原有含义。 ^:匹配正则表达式的开始行。 $:匹配正则表达式的结束行。 \<:从匹配正则表达式的行开始。 \>:到匹配正则表达式的行结束。 []:单个字符,如[A]即A符合要求 。 [-]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 .:所有的单个字符。 *:有字符,长度可以为0。 grep 'test' d* 显示以d开头的文件中包含的test行grep 'test' aa bb cc 查找文件aa bb cc 中匹配的test行grep 'test'|'hello' files 匹配test或者hellogrep '\<man' files 匹配manic 和man 不匹配batmangrep '\<man\>' 只匹配man 不匹配batman和manicgrep '^man' files 匹配的字符行首grep '$man' files 匹配的字符串仔行尾find用法find [-path ..] [expression]选项-name 按照文件名 -iname 按照文件名 忽略大小写 -perm 按照文件权限 -user 按照文件拥有者 -group 按照文件所属的组 -mtime -n +n 按照文件的更改时间来查找文件, -n:n天以内,+n:n天以前 -type 查找某一类型:文件类型有:普通文件(f),目录(d),字符设备文件(c),块设备文件(b),符号链接文件(l),套接字文件(s),管道文件(p) -size n 查找文件长度为n块(一块等于512字节)的文件,带有c时表示文件长度以字节计。 -mount 不跨越文件系统 -follow 遇到符号链接文件,就跟踪至链接所指向的文件 -path 匹配文件路径或者文件 -exec 执行后续命令操作 -a and 与操作 -o or 或操作 -not not 非操作经典使用方法#查找/run中所有的socket文件 find /run -type s #搜索/dev中所有包含tty的文件 find /dev -name "*tty*" #搜索/dev中大小大于10字节,名称包含bus的文件 find /dev -size +10c -name "*bus*" #或操作,搜索debug开头的文件或者.rst的文件 find -name 'debug*' -o -name '*.rst' #与操作,搜索debug开头的文件同时是.rst的文件 find -name 'debug*' -a -name '*.rst' #找出文件大小大于10000块的文件,并复制到当前目录 find -size +100000 -exec cp {} . \;高级使用方法查询所有mk文件中的date文本find ./build/ -name "*.mk" -print -exec grep -rwn "date" --color=auto {} \;lsusb显示系统中以及连接到系统的USB总线信息的工具。$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 003: ID 17ef:4811 Lenovo Integrated Webcam [R5U877] Bus 008 Device 002: ID 0a5c:217f Broadcom Corp. Bluetooth ControllerBus 008 : 指明设备连接到哪(哪条总线)Device 002 : 表明这是连接到总线上的第二台设备ID : 设备的IDBroadcom Corp. Bluetooth Controller :生产商名字和设备名列出USB详细信息$ lsusb -v列出有多少USB设备$ find /dev/bus打印特定设备的详细信息$ lsusb -D /dev/bus/usb/008/002lsof列出当前系统打开文件的工具$ sudo lsof COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 3,3 1024 2 / init 1 root rtd DIR 3,3 1024 2 / init 1 root txt REG 3,3 38432 1763452 /sbin/init init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1 init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1 init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so init 1 root 10u FIFO 0,15 1309 /dev/initctl COMMAND 进程的名称 PID 进程标识符 USER 进程所有者 FD 文件描述符 应用程序通过文件描述符识别该文件。如cwd、txt、mem等 TYPE 文件类型 REG(文件) DIR(目录) CHR(字符) BLK(块设备) FIFO(管道) UNIX(UNIX 域套接字) IPv4(IP套接字) DEVICE 指定磁盘的名称 SIZE 文件大小 NODE 文件inode 每个文件都有一个唯一的inode NAME 文件名称 参数列表lsof filename 显示打开指定文件的所有进程 lsof -a 表示两个参数都必须满足时才显示结果 lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件 lsof -u username 显示所属user进程打开的文件 lsof -g gid 显示归属gid的进程情况 lsof +d /DIR/ 显示目录下被进程打开的文件 lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长 lsof -d FD 显示指定文件描述符的进程 lsof -n 不将IP转换为hostname,缺省是不加上-n参数 lsof -i 用以显示符合条件的进程情况 lsof -i[46] [protocol][@hostname|hostaddr][:service|port] 46 --> IPv4 or IPv6 protocol --> TCP or UDP hostname --> Internet host name hostaddr --> IPv4地址 service --> /etc/service中的 service name (可以不只一个) port --> 端口号 (可以不只一个)查找应用程序打开的文件的名称和数目#显示打开指定文件的所有进程 $ lsof filename #例如:打开所有使用/dev/urandom的进程 $ lsof /dev/urandom #查看22端口现在运行的情况 $ lsof -i :22 #查看所属xiaxiaowen用户进程所打开的文件类型为txt的文件 $ lsof -a -u xiaxiaowen -d txt #查找谁在使用文件系统 $ lsof /media/xiaxiaowen/机械硬盘 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME zsh 8465 xiaxiaowen cwd DIR 8,17 8192 5 /media/xiaxiaowen/机械硬盘linux软件开发知识点linux进程间通讯方式内存申请函数linux内存分配说明gcc编译过程文件系统硬链接和软连接linux内核子系统进程几种状态文件系统组成linux文件类型linux常用的系统调用函数fork函数僵尸进程常见文件说明proc目录说明fopen参数说明linux进程间通讯方式管道(Pipe)及有名管道(named pipe)信号(Signal)报文(Message)队列(消息队列):共享内存信号量(semaphore)套接口(Socket)内存申请函数callocmallocrealloclinux内存分配说明内存存放数据说明静态存储区静态数据、全局数据、常量在程序编译的时候就已经分配好栈区局部变量、函数参数栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限堆区malloc申请的内存动态内存分配,需要手动释放代码区代码存放函数体的二进制代码文字常量区常量字符串程序结束后由系统释放gcc编译过程 过程 生成文件 预编译 *.i 编译 *.s 汇编 *.o 链接 可执行文件 文件系统 fat fat32 ntfs ext2 ext3 ext4 nfs 硬链接和软连接硬链接硬链接直接指向文件的i节点硬链接和原文件的i节点是一样的硬链接文件显示的大小是跟原文件是一样的硬链接不能链接目录文件。ln file2 /home/xiaxiaowen/file2hard软链接(符号链接)软链接则是建立了一个新文件这个文件指向链接的文件,i节点不一样可以链接目录ln -s file2 /home/xiaxiaowen/file2softlinux内核子系统进程管理内存管理I/O管理文件系统管理进程几种状态运行态就绪态阻塞态文件系统组成超级块:存放文件系统本身的信息,比如记录了每个区域的大小,或未被使用的磁盘块的信息。(不同版本稍有差别)i-节点表:每个文件都有其属性,大小,最近修改时间等等,这些被存储在ino_t 的结构体中,所有的i-节点都有一样的大小,i-节点表就是这样一些节点的列表。(表中的每个i-节点都通过位置来标志,例如标志为2的i-节点位于文件系统i-节点表中的第3个位置 )数据块:存放文件内容,因为块的大小一定,所以有时一个文件会分布在多个磁盘上。i 节点i 节点是一个64字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息.linux文件类型 文件类型 普通文件 目录 字符设备文件 块设备文件 符号链接文件 套接字文件 管道文件 属性 - d c b l s p linux常用的系统调用函数进程控制函数文件操作函数文件系统操作函数系统控制函数内存管理函数网络管理函数socket函数用户管理函数进程间通信函数信号相关函数消息相关函数管道相关函数信号量相关函数共享内存相关函数进程控制函数 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识号 setpgid 设置指定进程组标志号 getpgrp 获取当前进程组标识号 setpgrp 设置当前进程组标志号 getpid 获取进程标识号 getppid 获取父进程标识号 getpriority 获取调度优先级 setpriority 设置调度优先级 modify_ldt 读写进程的本地描述表 nanosleep 使进程睡眠指定的时间 nice 改变分时进程的优先级 pause 挂起进程,等待信号 personality 设置进程运行域 prctl 对进程进行特定操作 ptrace 进程跟踪 sched_get_priority_max 取得静态优先级的上限 sched_get_priority_min 取得静态优先级的下限 sched_getparam 取得进程的调度参数 sched_getscheduler 取得指定进程的调度策略 sched_rr_get_interval 取得按RR算法调度的实时进程的时间片长度 sched_setparam 设置进程的调度参数 sched_setscheduler 设置指定进程的调度策略和参数 sched_yield 进程主动让出处理器,并将自己等候调度队列队尾 vfork 创建一个子进程,以供执行新程序,常与execve等同时使用 wait 等待子进程终止 wait3 参见wait waitpid 等待指定子进程终止 wait4 参见waitpid capget 获取进程权限 capset 设置进程权限 getsid 获取会晤标识号 setsid 设置会晤标识号 文件操作函数 fcntl 文件控制 open 打开文件 creat 创建新文件 close 关闭文件描述字 read 读文件 write 写文件 readv 从文件读入数据到缓冲数组中 writev 将缓冲数组里的数据写入文件 pread 对文件随机读 pwrite 对文件随机写 lseek 移动文件指针 _llseek 在64位地址空间里移动文件指针 dup 复制已打开的文件描述字 dup2 按指定条件复制文件描述字 flock 文件加/解锁 poll I/O多路转换 truncate 截断文件 ftruncate 参见truncate umask 设置文件权限掩码 fsync 把文件在内存中的部分写回磁盘 文件系统操作函数 access 确定文件的可存取性 chdir 改变当前工作目录 fchdir 参见chdir chmod 改变文件方式 fchmod 参见chmod chown 改变文件的属主或用户组 fchown 参见chown lchown 参见chown chroot 改变根目录 stat 取文件状态信息 lstat 参见stat fstat 参见stat statfs 取文件系统信息 fstatfs 参见statfs readdir 读取目录项 getdents 读取目录项 mkdir 创建目录 mknod 创建索引节点 rmdir 删除目录 rename 文件改名 link 创建链接 symlink 创建符号链接 unlink 删除链接 readlink 读符号链接的值 mount 安装文件系统 umount 卸下文件系统 ustat 取文件系统信息 utime 改变文件的访问修改时间 utimes 参见utime quotactl 控制磁盘配额 系统控制函数 ioctl I/O总控制函数 _sysctl 读/写系统参数 acct 启用或禁止进程记账 getrlimit 获取系统资源上限 setrlimit 设置系统资源上限 getrusage 获取系统资源使用情况 uselib 选择要使用的二进制函数库 ioperm 设置端口I/O权限 iopl 改变进程I/O权限级别 outb 低级端口操作 reboot 重新启动 swapon 打开交换文件和设备 swapoff 关闭交换文件和设备 bdflush 控制bdflush守护进程 sysfs 取核心支持的文件系统类型 sysinfo 取得系统信息 adjtimex 调整系统时钟 alarm 设置进程的闹钟 getitimer 获取计时器值 setitimer 设置计时器值 gettimeofday 取时间和时区 settimeofday 设置时间和时区 stime 设置系统日期和时间 time 取得系统时间 times 取进程运行时间 uname 获取当前UNIX系统的名称、版本和主机等信息 vhangup 挂起当前终端 nfsservctl 对NFS守护进程进行控制 vm86 进入模拟8086模式 create_module 创建可装载的模块项 delete_module 删除可装载的模块项 init_module 初始化模块 query_module 查询模块信息 *get_kernel_syms 取得核心符号,已被query_module代替 内存管理函数 brk 改变数据段空间的分配 sbrk 参见brk mlock 内存页面加锁 munlock 内存页面解锁 mlockall 调用进程所有内存页面加锁 munlockall 调用进程所有内存页面解锁 mmap 映射虚拟内存页 munmap 去除内存页映射 mremap 重新映射虚拟内存地址 msync 将映射内存中的数据写回磁盘 mprotect 设置内存映像保护 getpagesize 获取页面大小 sync 将内存缓冲区数据写回硬盘 cacheflush dddd将指定缓冲区中的内容写回磁盘dd 网络管理函数 getdomainname 取域名 setdomainname 设置域名 gethostid 获取主机标识号 sethostid 设置主机标识号 gethostname 获取本主机名称 sethostname 设置主机名称 socket函数 socketcall socket系统调用 socket 建立socket bind 绑定socket到端口 connect 连接远程主机 accept 响应socket连接请求 send 通过socket发送信息 sendto 发送UDP信息 sendmsg 参见send recv 通过socket接收信息 recvfrom 接收UDP信息 recvmsg 参见recv listen 监听socket端口 select 对多路同步I/O进行轮询 close 关闭socket上的连接 getsockname 取得本地socket名字 getpeername 获取通信对方的socket名字 getsockopt 取端口设置 setsockopt 设置端口参数 sendfile 在文件或端口间传输数据 socketpair 创建一对已联接的无名socket 用户管理函数 getuid 获取用户标识号 setuid 设置用户标志号 getgid 获取组标识号 setgid 设置组标志号 getegid 获取有效组标识号 setegid 设置有效组标识号 geteuid 获取有效用户标识号 seteuid 设置有效用户标识号 setregid 分别设置真实和有效的的组标识号 setreuid 分别设置真实和有效的用户标识号 getresgid 分别获取真实的,有效的和保存过的组标识号 setresgid 分别设置真实的,有效的和保存过的组标识号 getresuid 分别获取真实的,有效的和保存过的用户标识号 setresuid 分别设置真实的,有效的和保存过的用户标识号 setfsgid 设置文件系统检查时使用的组标识号 setfsuid 设置文件系统检查时使用的用户标识号 getgroups 获取后补组标志清单 setgroups 设置后补组标志清单 进程间通信函数 ipc 进程间通信总控制调用 信号相关函数 sigaction 设置对指定信号的处理方法 sigprocmask 根据参数对信号集中的信号执行阻塞/解除阻塞等操作 sigpending 为指定的被阻塞信号设置队列 sigsuspend 挂起进程等待特定信号 signal 参见signal kill 向进程或进程组发信号 *sigblock 向被阻塞信号掩码中添加信号,已被sigprocmask代替 *siggetmask 取得现有阻塞信号掩码,已被sigprocmask代替 *sigsetmask 用给定信号掩码替换现有阻塞信号掩码,已被sigprocmask代替 *sigmask 将给定的信号转化为掩码,已被sigprocmask代替 *sigpause 作用同sigsuspend,已被sigsuspend代替 sigvec 为兼容BSD而设的信号处理函数,作用类似sigaction ssetmask ANSI C的信号处理函数,作用类似sigaction 消息相关函数 msgctl 消息控制操作 msgget 获取消息队列 msgsnd 发消息 msgrcv 取消息 管道相关函数 pipe 创建管道 信号量相关函数 semctl 信号量控制 semget 获取一组信号量 semop 信号量操作 共享内存相关函数 shmctl 控制共享内存 shmget 获取共享内存 shmat 连接共享内存 shmdt 拆卸共享内存 fork函数fork是用来创建子进程的,这个函数的特别之处在于一次调用,两次返回,一次返回到父进程中,一次返回到子进程中,我们可以通过返回值来判断其返回点:pid_t child = fork(); if( child < 0 ) { //fork error. perror("fork process fail.\n"); } else if( child ==0 ) { // in child process printf(" fork succ, this run in child process\n "); } else { // in parent process printf(" this run in parent process\n "); }僵尸进程僵尸进程产生原因僵尸进程解决办法ps指令查看僵尸进程僵尸进程产生原因一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。僵尸进程解决办法通过信号机制 子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。fork两次 父进程创建子进程A,子进程A再创建子进程B,然后子进程A退出,z这样子进程B就交给init进程处理了。init进程可以处理僵尸进程.ps指令查看僵尸进程ps -A -ostat,pid,cmd |grep -iE '^z'-A 显示所有任务 -o 按照指定格式输出 grep -iE 显示z开头的行,不区分大小写常见文件说明/var/log/boot.log 系统引导日志/var/log/dmesg 系统核心启动日志/var/log/messages 核心系统日志/var/log/maillog 邮件系统日志/var/log/xferlog FTP系统日志/var/log/syslog 系统出问题的日志/var/log/secure 安全信息和系统登录与网络连接的信息/var/log/wtmp 登录记录/var/spool/clientmqueue/proc/interrupts/etc/fstab Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统.proc目录说明proc文件系统是一个伪文件系统,它只存在内存当中。 /proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关 /proc/cmdline 启动时传递给kernel的参数信息 /proc/cpuinfo cpu的信息 /proc/crypto 内核使用的所有已安装的加密密码及细节 /proc/devices 已经加载的设备并分类 /proc/dma 已注册使用的ISA DMA频道列表 /proc/execdomains Linux内核当前支持的execution domains /proc/fb 帧缓冲设备列表,包括数量和控制它的驱动 /proc/filesystems 内核当前支持的文件系统类型 /proc/interrupts x86架构中的每个IRQ中断数 /proc/iomem 每个物理设备当前在系统内存中的映射 /proc/ioports 一个设备的输入输出所使用的注册端口范围 /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理 /proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关 /proc/locks 内核锁住的文件列表 /proc/mdstat 多硬盘,RAID配置信息(md=multiple disks) /proc/meminfo RAM使用的相关信息 /proc/misc 其他的主要设备(设备号为10)上注册的驱动 /proc/modules 所有加载到内核的模块列表 /proc/mounts 系统中使用的所有挂载 /proc/mtrr 系统使用的Memory Type Range Registers (MTRRs) /proc/partitions 分区中的块分配信息 /proc/pci 系统中的PCI设备列表 /proc/slabinfo 系统中所有活动的 slab 缓存信息 /proc/stat 所有的CPU活动信息 /proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的 /proc/uptime 系统已经运行了多久 /proc/swaps 交换空间的使用情况 /proc/version Linux内核版本和gcc版本 /proc/bus 系统总线(Bus)信息,例如pci/usb等 /proc/driver 驱动信息 /proc/fs 文件系统信息 /proc/ide ide设备信息 /proc/irq 中断请求设备信息 /proc/net 网卡设备信息 /proc/scsi scsi设备信息 /proc/tty tty设备信息 /proc/net/dev 显示网络适配器及统计信息 /proc/vmstat 虚拟内存统计信息 /proc/vmcore 内核panic时的内存映像 /proc/diskstats 取得磁盘信息 /proc/schedstat kernel调度器的统计信息 /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用 #### 以下是/proc目录中进程N的信息 /proc/N pid为N的进程信息 /proc/N/cmdline 进程启动命令 /proc/N/cwd 链接到进程当前工作目录 /proc/N/environ 进程环境变量列表 /proc/N/exe 链接到进程的执行命令文件 /proc/N/fd 包含进程相关的所有的文件描述符 /proc/N/maps 与进程相关的内存映射信息 /proc/N/mem 指代进程持有的内存,不可读 /proc/N/root 链接到进程的根目录 /proc/N/stat 进程的状态 /proc/N/statm 进程使用的内存的状态 /proc/N/status 进程状态信息,比stat/statm更具可读性 /proc/self 链接到当前正在运行的进程fopen参数说明参数说明r以只读方式打开文件,该文件必须存在。r+以可读写方式打开文件,该文件必须存在。rb+读写打开一个二进制文件,允许读写数据,文件必须存在。w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)a+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)wb只写打开或新建一个二进制文件;只允许写数据。wb+读写打开或建立一个二进制文件,允许读和写。ab+读写打开一个二进制文件,允许读或在文件末追加数据。wx创建文本文件,只允许写入数据.[C11]wbx创建一个二进制文件,只允许写入数据.[C11]w+x创建一个文本文件,允许读写.[C11]wb+x创建一个二进制文件,允许读写.[C11]w+bx和"wb+x"相同[C11]以x结尾的模式为独占模式,文件已存在或者无法创建(一般是路径不正确)都会导致fopen失败.文件以操作系统支持的独占模式打开.[C11]linux驱动开发知识点insmod rmmod 加载 卸载模块i.max6UL系统框图linux启动过程系统上电--->bootrom--->uboot--->kernel加载--->init--->应用程序makefilemakefile的规则target xxx : prerequisites aaa [command] ... ...prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行gcc工具链命令描述Binutils由汇编器(as)产生的目标代码(*.o)是不能直接在computer上运行的,它必须经过链接器(ld)的处理才能生成可执行代码。add2line将地址转换成文件名或行号对,以便调试程序ar从文件中创建、修改、扩展文件gasp汇编宏处理器nm从目标文件列举所有变量objcopy使用GNU BSD库把目标文件的内容从一种文件格式复制到另一种格式的目标文件中。objdump显示目标文件信息可发编译二进制文件,也可以对对象文件进行反汇编,并查看机器代码。readelf显示elf文件信息ranlib生成索引以加快对归档文件的访问,并将其保存到这个归档文件中。size列出目标模块或文件的代码尺寸。strings打印可打印的目标代码符号(至少4个字符)strip放弃所有符号连接,一般应用程序最终都要strip处理C++filt链接器ld通过该命令可过滤C++符号和JAVA符号,防止重载函数冲突。gprof显示程序调用段的各种数据nm命令显示二进制目标文件的符号表-A:每个符号前显示文件名; -D:显示动态符号; -g:仅显示外部符号; -r:反序显示符号表。ldd命令用于打印程序或者库文件所依赖的共享库列表。-v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; -d:执行重定位和报告任何丢失的对象; -r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;交叉编译工具链说明gcc 交叉编译器将写好的C程序代码编译为ARM架构下的可执行文件.gcc hello.c -o hellold 交叉链接器将多个编译后产生的过程文件连接为一个最终的可执行文件。ld [options] 链接器脚本 -o 文件名.elfreadelf 交叉ELF文件查看器用来查看一个可执行文件的相关信息可以查看elf文件的运行架构,大小端等信息:readelf -a 文件名.elf显示程序需要的动态链接库:readelf -d 文件名.elfobjdump 交叉反汇编器将一个可执行文件转换为汇编下的程序-objdump -D -S elf文件名 >目标文件objcopy 交叉转换器将elf格式文件转换成其他的格式objcopy -O 目标文件格式 原ELF文件 目标文件例子:objcopy -O binary a.elf a.bin
2024年12月12日
4 阅读
0 评论
0 点赞
1
...
3
4
5
...
35