二进制与TCP/IP four-storey model

一、进制

通常汇编将二进制编码转成十六进制形式展现出来,如下0000~1111。

二进制:0000   0001     0010     0011     0100     0101    0110     0111    1000    1001     1010     1011     1100     1101      1110      1111
十六进制:0       1          2           3          4           5         6          7          8          9          A          B           C          D           E           F

二、单位
1、位(bit):只能储存0或者1,计算机中最小储存单位。
2、字节(byte):8个位。(1个字节等于8个位,同理如下)储存最大值(十六进制)为FF。
3、字(word):16个位。储存最大值(十六进制)为FFFF。
4、双字(doubleword):32个位。储存最大值(十六进制)为FFFFFFFF。

三、0/1编码

文件:不同类型文件的0和1代表的含义不一样。

字符:ASCII码。

立即数:
1、无符号数的编码规则:这个数是多少就存多少。
2、有符号数的编码规则(正或负):
       原码:最高位为符号位(正或负),其余各位为数值本身的绝对值。
       反码:
               正数:反吗与原码相同。
               负数:符号位为1,其余位对原码取反。
       补码:
               正数:补码与原码相同
               负数:符号位为1,其余位对原码取反加1


总结:1、正数原码存储。
         2、负数补码存储。

C语言内存分配

正文:正文段是可共享的,常常是只读的。

初始化数据:通常将此段称为数据段,它包含了程序中需明确地赋初值的变量。

未初始化数据:通常将此段称为 bss 段。只定义未赋值的变量,内核将此段中的数据初始化为 0 或空指针。

堆:通常在堆中进行动态存储分配。

栈:自动变量以及每次函数调用时所需环境信息(返回地址、所需要机器寄存器的值等)都存放在栈中。每次函数调用,就用一个新的栈帧。

磁盘程序文件只存放有正文段和初始化数据段。

Linux信号(信号的本质是函数,因此信号处理方法具有普适性)

使用 trap -l 或者 kill -l 来查看信号的编号及关联的名称

 1 [party_a@localhost ~]$ kill -l
 2  1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 3  6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
 4 11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
 5 16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
 6 21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
 7 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
 8 31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
 9 38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
10 43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
11 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
13 58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
14 63) SIGRTMAX-1  64) SIGRTMAX

trap 命令语法:

trap 执行的shell命令 signal                #signal为接收到的信号,可以是信号的编号,也可以是信号名

trap '命令 ;命令' signal                        #接收到信号后,执行多条命令。

trap '命令 ;命令' signal signal  signal           #同时接收多个信号后

例如:trap ':' INT EXIT TSTP TERM HUP         #<==屏蔽这些信号,通常部署在跳板机上,用来保护跳板机的限制脚本。

重要信号及说明

1) HUP       挂起,通常因终端掉线或用户退出引发
2) INT       中断,通常按 Ctrl+c 组合键引发  
3) QUIT      退出,通常按 Ctrl+\组合键引发  
6) ABRT      中止,通常因某些执行错误引发
14)ALRM     报警,通常用来处理超时
15)TERM     终止,通常在关机的时候发送
20)TSTP     停止进程运行,通常按 Ctrl+z 组合键引发 


--网络接口层

MAC地址:准确的说他必须在一个LAN内是唯一的。他又48位的十六进制组成,前24位是厂商表示,后24位 是厂商自定义的序列号。有时候 MAC地址就是表示了一个设备的位置。

--网际层

子网掩码

1、子网掩码决定的是一个子网的计算机数目计算机公式是2的m次方,其中,我们可以把m看到是后面的多少颗0。如255.255.255.0转换成二进制,那就是11111111.11111111.11111111.00000000,后面有8颗0,那m就是8,255.255.255.0这个子网掩码可以容纳2的8次方(台)电脑,也就是256台,但是有两个IP是不能用的,那就是最后一段不能为0和255,减去这两台,就是254台。

2、子网掩码2进制中的“1”对应的IP地址部分是网络地址,“0”对应的部分是主机地址,计算一个IP地址的网络地址、主机地址、广播地址就是根据子网掩码确定。  

3、划分子网后必然会采用特殊的子网掩码,因此IP地址的网络地址、主机地址、广播地址就不能按照缺省的子网掩码来计算

(比如C类地址缺省子网掩码是255.255.255.0,但是采用特殊的子网掩码后应该按照新的子网掩码来计算,比如255.255.255.192)。
实例1:IP地址192.168.1.200,子网掩码是255.255.255.224,要求计算其网络地址、主机地址和广播地址。    
分析:把子网掩码换算成2进制,1对应的部分是网络地址,0对应的部分是主机地址,把主机地址各位全部变成1就是广播地址。  
因此首先把255.255.255.224换算成2进制,就是11111111.11111111.11111111.11100000,然后把IP地址也换算成2进制,就是11000000.10101000.00000001.11001000,因此可以得到网络地址就是11000000.10101000.00000001.11000000,即192.168.1.192;主机地址就是00001000,即8;而广播地址就是11000000.10101000.00000001.11011111,即192.168.1.223。

首先用2的8次方既256-224(子网掩码最后一位得出子网中得到所容纳的IP地址)=32 那么我们现在要找到小于200又是32的倍数得出是192。 所以得出了网络地址,要得到广播地址则下一个网络的网络地址减1既是224-1=223既得出广播地址192.168.1.223

computational formula: 广播地址 =网络地址 | (~子网掩码)
|:位或运算; ~:按位取反

IP地址由四段数字组成

在此,我们先解一下3类常用的IP

  A类IP段 0.0.0.0 到127.255.255.255
  B类IP段 128.0.0.0 到191.255.255.255
  C类IP段 192.0.0.0 到223.255.255.255

  
XP默认分配的子网掩码每段只有255或0
  A类的默认子网掩码 255.0.0.0 一个子网最多可以容纳1677万多台电脑
  B类的默认子网掩码 255.255.0.0 一个子网最多可以容纳6万台电脑
  C类的默认子网掩码 255.255.255.0 一个子网最多可以容纳254台电脑
  
  要想在同一网段,只要子网掩码网络标识相同。那255.255.248.0这个子网掩码最多容纳多少台电脑?首先要做的是把每段的IP转换为二进制。(有人说,我不会转换耶,没关系,我们用Windows自带计算器就行。打开计算器,点查看>科学型,输入十进制的数字,再点一下“二进制”这个单选点,就可以切换至二进制了。)
  计算方法:
  把将其转换为二进制的四段数字(每段要是8位,如果是0,可以写成8个0,也就是00000000)
  11111111.1111111.11111000.00000000
  然后,数数后面有几颗0,一共是有11颗,那就是2的11次方,等于2048,这个子网掩码最多可以容纳2048台电脑。
  一个子网最多可以容纳多少台电脑你会算了吧,下面我们来个逆向算法的题。
  一个公司有530台电脑,组成一个对等局域网,子网掩码设多少最合适?
  首先,无疑,530台电脑用B类IP最合适(A类不用说了,太多,C类又不够,肯定是B类),但是B类默认的子网掩码是255.255.0.0,可以容纳6万台电脑,显然不太合适,那子网掩码设多少合适呢?我们先来列个公式。
  2的m次方=560
  首先,我们确定2一定是大于8次方的,因为我们知道2的8次方是256,也就是C类IP的最大容纳电脑的数目,我们从9次方一个一个试2的9次方是512,不到560,2的10次方是1024,看来2的10次方最合适了。子网掩码一共由32位组成,已确定后面10位是0了,那前面的22位就是1,最合适的子网掩码就是:11111111.11111111.11111100.00000000,转换成10进制,那就是255.255.252.0。

网络地址

网络地址是因特网协会的ICANN(the Internet Corporation for Assigned Names and Numbers)分配的,下有负责北美地区的InterNIC、负责欧洲地区的RIPENIC和负责亚太地区的APNIC 目的是为了保证网络地址的全球唯一性。主机地址是由各个网络的系统管理员分配。因此,网络地址的唯一性与网络内主机地址的唯一性确保了IP地址的全球唯一性。

computational formula : 将IP地址和子网掩码都换算成二进制,然后进行与运算,结果就是网络地址。

网关——实质上是一个网络通向其他网络的IP地址。

nginx启用fastcgi 网关接口
写在 location {} 规则中。

附上以下几句配置规则的意思:

include /etc/nginx/fastcgi_params;          #表示nginx会调用fastcgi这个接口

fastcgi_intercept_errors on;                    #表示开启fastcgi的中断和错误信息记录

fastcgi_pass 127.0.0.1:9000;    # 表示nginx通过fastcgi_pass将用户请求的资源发给127.0.0.1:9000进行解析,这里的nginx和php脚本解析服务器是在同一台机器上,所以127.0.0.1:9000表示的就是本地的php脚本解析服务器。

ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC地址

OSPF(Open Shortest Path First)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,是一种面向无连接的协议,用于在IP主机路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。

NAT协议:nat网络地址转换,是为了解决ipv4地址空间不足产生的,原理就是替换掉数据包中的源ip+端口或目标ip+端口,达到私有地址不能再公网上传播,或者是局域网中服务器的发布。实现方式大致分成静态NAT和动态NAT PAT(端口复用),一定程度上提高了局域网用户的安全性。

描述一下HSRP

热备路由协议 是Cisco私有的网关冗余协议。它是由一组路由器(最低2台)构成的一个热备组 作用是为用户提供一个不间断的网关ip,用户通过这个ip访问互联网,即使真实的网关设备DOWN掉一台,也不会影响客户的正常工作。

原理: 热备组中包含4中路由器的角色,

活跃路由器:负责承载发往虚拟ip地址的流量,是真正转发用户数据流量的路由器,

同时向UDP1985发送hello包 表明自己的状态,一个组中只有一台。

备份路由器:监听整个HSRP组的状态,是成为下一个活跃路由器之前的状态,一个组中只有一个 同时向组中发送

其他路由器:静听整个HSRP组的状态,是备份路由器的候选者

虚拟路由器:为客户端提供一个虚拟的ip和MAC  能够然活跃路由器转发。

当活跃路由器Down后 备份路由器收不到hello包 就会成为活跃路由器。而这个转换的过程用户是感觉不到的。

--运输层

这一层有两个重要的协议 TCP(三次握手)和UDP (不需要三次握手),还有端口概念,代表应用层协议

 io多路复用

io分为磁盘io和网络io,这里说的是网络io。我们知道计算机之间传输数据是流传输。一台计算机网络io只会有一个。

这里说单进程
在最基本的c/s demo中,send/recv就是在一条io通道收发数据,这就是基本的网络io,但是这种操作是不能“填满”io的,也就是说大部分io资源你没有用,仅仅有一个io操作,当然你可以开多进程或多线程,代价可想而知

此时出现了io多路复用,自己的话翻译一下,复用网络io从而有多个io操作能在网络io中执行。

linux下网络io使用socket套接字来通信,普通io模型只能监听一个socket,而io多路复用可同时监听多个socket

io多路复用避免阻塞在io上,原本为多进程或多线程来接收多个连接的消息变为单进程或单线程保存多个socket的状态后轮询处理

实现io多路复用需要函数来支持,就是你说的linux下的select/poll,epoll以及win下 iocp 和 BSD 的 kqueue

epoll

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

简单说epoll和select/poll最大区别是
1.epoll内部使用了mmap共享了用户和内核的部分空间,避免了数据的来回拷贝
2.epoll基于事件驱动,epoll_ctl注册事件并注册callback回调函数,epoll_wait只返回发生的事件避免了像select和poll对事件的整个轮寻操作。

epoll属于事件驱动模型的事件收集器,nginx中就使用了epoll,将注册过的事件中发生的事件收集起来,master进程负责管理worker进程。

阻塞与非阻塞——程序在等待消息(无所谓同步或者异步)时的状态

阻塞——调用结果返回之前,当前线程会被挂起。
socket接收数据函数recv是一个阻塞调用的例子。
当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞——和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

 

协程——多个线程互相协作,完成一个任务。

举例来说,读取文件的协程写法如下。


function asnycJob() {
  // ...其他代码
  var f = yield readFile(fileA);
  // ...其他代码
}

上面代码的函数 asyncJob 是一个协程,协程遇到 yield 命令就暂停,执行权将交给其他协程,执行权返回再从暂停的地方继续往后执行。

Cache-Control 

网页缓存是由HTTP消息头中的Cache-control规则来控制,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。

Cache-control参数值 说明
public 所有内容都将被缓存(客户端和代理服务器都可缓存)
private 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)
no-cache 必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。
no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证

php的cURL初步使用

        PHP支持的由Daniel Stenberg创建的libcurl库允许你(模拟)与各种的服务器使用各种类型的协议进行连接和通讯。libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。

 用curl资源模拟浏览器的请求:

 1 <?php
 2      // 创建一个新cURL资源
 3     $ch  =  curl_init ();
 4 
 5     // 设置URL和相应的选项
 6     curl_setopt ( $ch ,  CURLOPT_URL ,  "http://www.example.com/" );
 7     //不设置请求头信息
 8     curl_setopt ( $ch ,  CURLOPT_HEADER ,  0 );
 9     //开启模拟POST请求
10     curl_setopt($ch,CURLOPT_POST,1);
11     /*
12     curl_setopt()常用选项说明:
13     CURLOPT_URL:设置模拟浏览器的请求地址
14     CURLOPT_RETURNTANSFER(1):捕获内容但不输出
15     CURLOPT_HEADER(0或1):设置请求头信息;设置为1
16     CURLOPT_POST(1):是否开启模拟POST请求;开启为1
17     CURLOPT_POSTFIELDS:设置POST请求时传递的参数,(当参数为数组时,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。)
18      */
19     
20      // 执行cURL资源
21     $result=curl_exec ( $ch );
22     echo $result;
23      // 关闭cURL资源,并且释放系统资源
24     curl_close ( $ch );
25 ?> 

 

posted @ 2017-08-09 00:07  兰昌  阅读(1442)  评论(0编辑  收藏  举报