AIRobot

AIRobot quick note


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

OSI七层模型功能和常见设备及协议

发表于 2019-03-30 更新于 2019-04-13 分类于 network
本文字数: 1k 阅读时长 ≈ 1 分钟

OSI七层协议从上到下依次是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层;记忆则为“应表会传网数物”

应用层

  • 主要功能 :用户接口、应用程序。应用层向应用进程展示所有的网络服务。当一个应用进程访问网络时,通过该层执行所有的动作。
  • 典型设备:网关
  • 典型协议、标准和应用:TELNET, FTP, HTTP

表示层

  • 主要功能 :数据的表示、压缩和加密。定义由应用程序用来交换数据的格式,该层负责协议转换、数据编码和数据压缩。转发程序在该层进行服务操作。
  • 典型设备:网关
  • 典型协议、标准和应用:ASCLL、PICT、TIFF、JPEG、 MIDI、MPEG

会话层

  • 主要功能 :会话的建立和结束,在分开的计算机上的两种应用程序之间建立一种虚拟链接,这种虚拟链接称为会话(session)。会话层通过在数据流中设置检查点而保持应用程序之间的同步。允许应用程序进行通信的名称识别和安全性的工作就由会话层完成。
  • 典型设备:网关
  • 典型协议、标准和应用:RPC、SQL、NFS 、X WINDOWS、ASP

传输层

  • 主要功能 :端到端控制,确保按顺序无错的发送数据包。传输层把来自会话层的大量消息分成易于管理的包以便向网络发送
  • 典型设备:网关
  • 典型协议、标准和应用:TCP、UDP、SPX

网络层

  • 主要功能 :路由,寻址,网络层确定把数据包传送到其目的地的路径。就是把逻辑网络地址转换为物理地址。如果数据包太大不能通过路径中的一条链路送到目的地,那么网络层的任务就是把这些包分成较小的包。
  • 典型设备:路由器,网桥路由器
  • 典型协议、标准和应用:IP、IPX、APPLETALK、ICMP

数据链路层

  • 主要功能 :保证误差错的数据链路,一方面接收来自网络层(第三层)的数据帧并为物理层封装这些帧;另一方面数据链路层把来自物理层的原始数据比特封装到网络层的帧中。起着重要的中介作用。数据链路层由IEEE802规划改进为包含两个子层:介质访问控制(MAC)和逻辑链路控制(LLC)。
  • 典型设备:交换机、网桥、网卡
  • 典型协议、标准和应用:802.2、802.3ATM、HDLC、FRAME RELAY

物理层

  • 主要功能 :传输比特流,工作在最底层,透明地传输比特流,就是传输的信号
  • 典型设备:集线器、中继器,电缆,发送器,接收器
  • 典型协议、标准和应用:V.35、EIA/TIA-232

    原文链接

    link

内存分配中的堆栈静态区(全局区)只读区(常量区、代码区)

发表于 2019-03-30 分类于 operate system
本文字数: 1.7k 阅读时长 ≈ 2 分钟

概述

示意图

1
2
3
4
5
高地址   栈区⬇️
堆区⬆️
静态区(全局区)
常量区
低地址 代码区
  • 代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。
  • 常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)
  • 静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放
  • 堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏
  • 栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
main.cpp 
  int a = 0; //全局初始化区
  char *p1; //全局未初始化区
  main()
  {
  int b; //栈
  char s[] = "abc"; //栈
  char *p2; //栈
  char *p3 = "123456"; //123456\0在常量区,p3在栈上。
  static int c =0; //全局(静态)初始化区
  p1 = (char *)malloc(10); //堆
  p2 = (char *)malloc(20); //堆
p1= "123456"; //123456\0在常量区,编译器将p1与p3所指向的“123456\0”优化成同一个地方。
  }

申请后系统的响应

  • 栈 只要栈剩余空间大于申请空间,系统就会分配,否则报栈溢出异常。
  • 堆 当系统收到程序的申请时,会遍历空闲内存地址链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的 delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

申请效率的比较

  • 栈 系统分配,速度快,用户透明

  • 堆 速度慢,会产生碎片,用户按需分配

    申请大小的限制

  • 栈 系统有默认大小

  • 堆 一般由系统内存所限

    全局变量、局部变量、静态全局变量、静态局部变量的区别是:

  • 生存周期不同

  • 作用范围不同

  • 分配方式不同

  • 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

  • 局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

  • 静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

从分配内存空间看:全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。

从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

参考

link

C++ Note

发表于 2019-03-27
本文字数: 1.5k 阅读时长 ≈ 1 分钟

new/delete和malloc/free的关系

  • new/delete是C++关键字,需要编译器支持。malloc/free是C/C++库函数。
  • new/delete在创建和销毁时会调用构造/析构函数

new/delete和new []/delete []

  • new/delete只会调用一次构造/析构函数,new/delete []会为每个成员调用。
  • 前者操作整个数组,后者造作一个指针。

memcpy和memmove

  • memcpy在内存重叠的情况下会出错,memmove进行了改进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void* my_memmove(void* dst, const void* src, size_t n)
{
char* s_dst;
char* s_src;
s_dst = (char*)dst;
s_src = (char*)src;
if(s_dst>s_src && (s_src+n>s_dst)) {
s_dst = s_dst+n-1;
s_src = s_src+n-1;
while(n--) {
*s_dst-- = *s_src--;
}
}else {
while(n--) {
*s_dst++ = *s_src++;
}
}
return dst;

如何修改int变量的第2个字节的值,交换第1个字节和第4个字节

*(((char *)&a)+1) = value;
先对int变量取地址,然后转为单字节变量指针,+1移位到第二字节,最后赋值value。

a &= 0xffff0ff; a |= value<<8;
先将第2字节置0,然后value移位赋值。

1
2
3
4
5
6
char low,high;
low = *(char *)&a;
high = *((char *)&a+3);
cout<<(short)low<<','<<(short)high<<endl;
*((char *)&a) = high;
*(((char *)&a)+3) = low;

a = ((a&0xff)<<24 | (a&0xff000000)>>24 | (a&0xffff00));

看到网上也有用memmove,我觉得不必要, 还是位操作好一些吧,linux内核也是这么做的,但是易读性好像更差一些。

new/delete和operator new/delete

new operator 和 delete operator :new 和 delete 操作符(关键字),无法重载

operator new 和 operator delete:两个函数用来服务于 new 和 delete 操作符,以及对应的 operator new [] , operator delete [] 对应于 new [] 和 delete []相关的数组操作;这两个函数是可以被重载的,一般有全局默认的函数,自己也可以定义自己的,在定义C++类的时候也可以为某个class定制对应的 operator new 和 operator delete

iptables模拟丢包

发表于 2019-03-26 更新于 2019-04-02 分类于 network
本文字数: 694 阅读时长 ≈ 1 分钟

查看

iptables -nvL --line-number

  • -L 查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表,可以加上-t NAT参数
  • -n 不对ip地址进行查,加上这个参数显示速度会快很多
  • -v 输出详细信息,包含通过该规则的数据包数量,总字节数及相应的网络接口
  • –line-number 显示规则的序列号,这个参数在删除或修改规则时会用到

添加

添加规则有两个参数:-A和-I。其中-A是添加到规则的末尾;-I可以插入到指定位置,没有指定位置的话默认插入到规则的首部
添加一条规则到第2行

iptables -I INPUT 2 -s 192.168.2.107 -j DROP

删除

删除用D

iptables -D INPUT -s 192.168.2.107 -j DROP

删除之前添加的一条规则
有时候有些规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以先使用–line-numbers查看出该条规则的行号,再通过行号删除
删除第二行规则

iptables -D INPUT 2

修改

修改使用R参数
将第三行改为accept

iptables -R INPUT 3 -j ACCEPT

当然iptables还是可以模拟丢包,很多人说tc用起来更方便,但是tc是基于网卡的操作,而iptables是可以基于指定的ip进行丢包处理,这无非是使用虚机的小伙伴们的福音啦~

iptables -I INPUT -s 192.168.2.107 -m statistic --mode random --probability 0.5 -j DROP

多边形求最小面积

发表于 2019-03-23 分类于 algorithm
本文字数: 1.5k 阅读时长 ≈ 1 分钟

题目:Ancient Berland Circus

题意:给你一个正凸多边形的三个点,然后求出这个正凸多边形的面积的最小值。

方法是这样的:以这三个点做一个三角形,求出这个三角形的外心(外接圆的圆心),这个点也就是外接多边形的中心

然后找出内角所对应的边数的GCD

当然,内角所对应的边数不一定是整数,我们需要用double的GCD和LCM进行计算,求出最小边数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
#include <stack>
using namespace std;

const double PI = acos(-1.0);
const double eps = 1e-4;

//浮点数的GCD
double gcd(double x, double y)
{
while(fabs(x) > eps && fabs(y) > eps)
{
if(x > y)
x -= floor(x/y)*y;
else
y -= floor(y/x)*x;
}
return x+y;
}

double a_cos(double a, double b, double c)
{
return acos((a*a+b*b-c*c)/(2*a*b));
}

int main()
{
//freopen("aa.in", "r", stdin);
//freopen("bb.out", "w", stdout);

double x1, y1, x2, y2, x3, y3;
scanf("%lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3);
double a = sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
double b = sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
double c = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double A = a_cos(b, c, a);
double B = a_cos(a, c, b);
double C = a_cos(a, b, c);
double P = (a + b + c) / 2;
double S = sqrt(P*(P-a)*(P-b)*(P-c));
double R = (a*b*c)/(4*S);
double N = PI/gcd(A, gcd(B, C));
printf("%.8lf\n", 0.5*R*R*sin(2*PI/N)*N);
return 0;
}

原文

1…181920…26
AIRobot

AIRobot

AIRobot quick note
130 日志
15 分类
23 标签
GitHub E-Mail
Creative Commons
0%
© 2023 AIRobot | 716k | 10:51