笔记栈

  • 首页

  • 归档

  • 搜索

网络协议

发表于 2017-09-17 | 更新于 2019-05-06

定义


网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
网络协议主要由三个要素组成:

  • 语义,表示要做什么。
  • 语法,表示要怎么做。
  • 时序,表示做的顺序。

网络协议是网络上所有设备(网络服务器、计算机、交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。

由于网络节点之间联系的复杂性,在制定协议时,通常把复杂成分分解成一些简单成分,然后再将它们复合起来。最常用的复合技术就是层次方式,网络协议的层次结构如下:

  • 结构中的每一层都规定有明确的服务及接口标准。
  • 把用户的应用程序作为最高层。
  • 除了最高层外,中间的每一层都向上一层提供服务,同时又是下一层的用户。
  • 把物理通信线路作为最低层,它使用从最高层传送来的参数,是提供服务的基础。

分层详情


为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了“开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。
其中第四层完成数据传送服务,上面三层面向用户。对于每一层,至少制定两项标准:服务定义和协议规范。前者给出了该层所提供的服务的准确定义,后者详细描述了该协议的动作和各种有关规程,以保证服务的提供。以下为各层详细介绍:

  1. 物理层
    规定通信设备的机械的、电气的、功能的和过程的特性,用以建立、维护和拆除物理链路连接。具体地讲,机械 特性规定了网络连接时所需接插件的规格尺寸、引脚数量和排列情况等;电气特性规定了在物理连接上传输bit流时线路上信号电平的大小、阻抗匹配、传输速率 距离限制等;功能特性是指对各个信号先分配确切的信号含义,即定义了DTE和DCE之间各个线路的功能;规程特性定义了利用信号线进行bit流传输的一组操作规程。在这一层,数据的单位称为比特(bit)。属于物理层定义的包括:以太网、调制解调器、电力线通信(PLC)、SONET/SDH、G.709、光导纤维、同轴电缆、双绞线等。

  2. 数据链路层
    在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(Frame)。属于数据链路层的包括:Wi-Fi(IEEE 802.11)、WiMAX(IEEE 802.16)、ATM、DTM、令牌环、以太网、FDDI、帧中继、GPRS、EVDO、HSPA、HDLC、PPP、L2TP、PPTP、ISDN、STP等。

  3. 网络层
    在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息–源站点和目的站点地址的网络地址。如果你在谈论一个IP地址,那么你是在处理第三层的问题,这是“数据包”问题,而不是第二层的“帧”。IP是第三层问题的一部分,此外还有一些路由协议和地址解析协议(ARP)。有关路由的一切事情都在这第三层处理。地址解析和路由是三层的重要目的。网络层还可以实现拥塞控制、网际互连等功能。在这一层,数据的单位称为数据包(packet)。网络层的协议包括:IP(IPv4、IPv6)、ICMP、ICMPv6、IGMP、IS-IS、IPsec、ARP、RARP等。

  4. 传输层
    第4层的数据单元也称作数据包(packets)。但是,当你谈论TCP等具体的协议时又有特殊的叫法,TCP的数据单元称为段 (segments)而UDP协议的数据单元称为“数据报(datagrams)”。这个层负责获取全部信息,因此,它必须跟踪数据单元碎片、乱序到达的 数据包和其它在传输过程中可能发生的危险。第4层为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务。所为透明的传输是指在通信过程中 传输层对上层屏蔽了通信传输系统的具体细节。传输层的协议包括:TCP、UDP、TLS、DCCP、SCTP、RSVP、OSPF等。

  5. 会话层
    这一层也可以称为会晤层或对话层,在会话层及以上的高层次中,数据传送的单位不再另外命名,而是统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的。

  6. 表示层
    这一层主要解决拥护信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩, 加密和解密等工作都由表示层负责。

  7. 应用层
    应用层为操作系统或网络应用程序提供访问网络服务的接口。应用层的协议包括:
    DHCP、DNS、FTP、Gopher、HTTP、IMAP4、IRC、NNTP、XMPP、POP3、SIP、SMTP、SNMP、SSH、TELNET、RPC、RTCP、RTP、RTSP、SDP、SOAP、GTP、STUN、NTP、SSDP、BGP、RIP等。

概念及原理


  • Socket(套接字)
    套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

  • TCP连接
    TCP连接包含三次握手过程,其过程介绍如下:

    1. 客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
    2. 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    3. 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”。

  • Socket连接
    由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
    建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket。
    套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

    1. 服务器监听
      服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

    2. 客户端请求
      指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

    3. 连接确认
      当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

  • HTTP连接
    HTTP协议是建立在TCP协议之上的一种应用,HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

  • TCP/IP协议,HTTP协议,Socket三者之间的关系
    实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,它只是提供了一个针对TCP或者UDP编程的接口。

正向代理和反向代理的理解

发表于 2017-09-16 | 更新于 2019-05-06

正向代理


我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些科学上网工具扮演的就是典型的正向代理角色。用浏览器访问http://www.google.com时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。
正向代理

反向代理


反向代理隐藏了真实的服务端,当我们请求http://www.baidu.com的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,http://www.baidu.com就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。
反向代理

总结


两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。

用nginx的反向代理机制解决前端跨域问题

发表于 2017-09-16 | 更新于 2019-05-06

什么是跨域以及产生原因


跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。
跨域情况如下:

url 说明 是否跨域
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名 是
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹 否
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口 是
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议 是
http://www.a.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip 是
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 是
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名 是

跨域的常见解决方法


目前来讲没有不依靠服务器端来跨域请求资源的技术

  • jsonp 需要目标服务器配合一个callback函数。
  • window.name+iframe 需要目标服务器响应window.name。
  • window.location.hash+iframe 同样需要目标服务器作处理。
  • html5的postMessage+ifrme这个也是需要目标服务器或者说是目标页面写一个postMessage,主要侧重于前端通讯。
  • CORS需要服务器设置header :Access-Control-Allow-Origin。(GZT使用的是这个方法)
  • nginx反向代理 这个方法一般很少有人提及,但是他可以不用目标服务器配合,不过需要你搭建一个中转nginx服务器,用于转发请求。

nginx反向代理解决跨域


上面已经说到,禁止跨域问题其实是浏览器的一种安全行为,而现在的大多数解决方案都是用标签可以跨域访问的这个漏洞或者是技巧去完成,但都少不了目标服务器做相应的改变,而我最近遇到了一个需求是,目标服务器不能给予我一个header,更不可以改变代码返回个script,所以前5种方案都被我否决掉。最后因为我的网站是我自己的主机,所以我决定搭建一个nginx并把相应代码部署在它的下面,由页面请求本域名的一个地址,转由nginx代理处理后返回结果给页面,而且这一切都是同步的。
假如www.a.com/html/msg.html想请求www.b.com/api/?method=1&para=2。

  • www.a.com/html/msg.html如下:

    1
    2
    3
    4
    5
    6
    var url = 'http://www.b.com/api/msg?method=1&para=2';
    <br>$.ajax({
    type: "GET",
    url:url,
    success: function(res){}
    })
  • 上面的请求必然会遇到跨域问题,这时我们需要修改一下我们的请求url,让请求发在nginx的一个url下:

    1
    2
    3
    4
    5
    6
    var url = 'http://www.c.com/proxy/html/api/msg?method=1&para=2'; //www.c.com是nginx主机地址
    $.ajax({
    type: "GET",
    url:url,
    success: function(res){}
    })
  • nginx配置如下:

    1
    2
    3
    4
    location ^~/proxy/html/{
    rewrite ^/proxy/html/(.*)$ /$1 break;
    proxy_pass http://www.b.com/;
    }
    1. ^~ /proxy/html/
      用于拦截请求,匹配任何以 /proxy/html/开头的地址,匹配符合以后,停止往下搜索正则。
    2. rewrite ^/proxy/html/(.*)$ /$1 break;
      • 代表重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用,例如在www.c.com/proxy/html/api/msg?method=1&para=2中只对/proxy/html/api/msg重写。
      • rewrite后面的参数是一个简单的正则 ^/proxy/html/(.*)$,$1代表正则中的第一个(),$2代表第二个()的值,以此类推。
      • break代表匹配一个之后停止匹配。
    3. proxy_pass
      既是把请求代理到其他主机。

linux创建目录或文件的默认权限

发表于 2017-09-15 | 更新于 2019-05-06

我们创建文件的默认权限是怎么来的?

当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。

如何改变这个默认权限呢?

一般在/etc/profile、$ [HOME]/.bash_profile或$[HOME]/.profile中设置umask值。

如何计算umask值?

umask命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、同组用户、其他用户)存在一个相应的umask值中的数字。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来说,umask中各个数字最大可以到7。

该命令的一般形式为:umask nnn
其中nnn为umask置000 - 777

我们只要记住umask是从权限中“拿走”相应的位即可。下表是umask值与权限的对照表:

umask file dir
0 6 7
1 6 6
2 4 5
3 4 4
4 2 3
5 2 2
6 0 1
7 0 0

如:umask值为022,则默认目录权限为755,默认文件权限为644。

IO多路复用是什么意思

发表于 2017-09-15 | 更新于 2019-05-06

假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接乘客。
你会怎么做?
最简单的做法,就是你去招一大批空管员,然后每人盯一架飞机, 从进港,接客,排位,出港,航线监控,直至交接给下一个空港,全程监控。
那么问题就来了:

  • 很快你就发现空管塔里面聚集起来一大票的空管员,交通稍微繁忙一点,新的空管员就已经挤不进来了。
  • 空管员之间需要协调,屋子里面就1, 2个人的时候还好,几十号人以后 ,基本上就成菜市场了。
  • 空管员经常需要更新一些公用的东西,比如起飞显示屏,比如下一个小时后的出港排期,最后你会很惊奇的发现,每个人的时间最后都花在了抢这些资源上。

现实上我们的空管同时管几十架飞机稀松平常的事情, 他们怎么做的呢?
他们用这个东西
空管
这个东西叫flight progress strip.每一个块代表一个航班,不同的槽代表不同的状态,然后一个空管员可以管理一组这样的块(一组航班),而他的工作,就是在航班信息有新的更新的时候,把对应的块放到不同的槽子里面。
这个东西现在还没有淘汰哦,只是变成电子的了而已。
是不是觉得一下子效率高了很多,一个空管塔里可以调度的航线可以是前一种方法的几倍到几十倍。
如果你把每一个航线当成一个Sock(I/O 流), 空管当成你的服务端Sock管理代码的话.
第一种方法就是最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的进程管理。)
第二种方法就是I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流。)

其实“I/O多路复用”这个坑爹翻译可能是这个概念在中文里面如此难理解的原因。所谓的I/O多路复用在英文中其实叫 I/O multiplexing. 如果你搜索multiplexing啥意思,基本上都会出这个图:
io multiplexing
于是大部分人都直接联想到”一根网线,多个sock复用”这个概念,其实不管你用多进程还是I/O多路复用,网线都只有一根好伐。多个Sock复用一根网线这个功能是在内核+驱动层实现的。

重要的事情再说一遍: I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流.发明它的原因,是尽量多的提高服务器的吞吐能力。

是不是听起来好拗口,看个图就懂了.
io multiplexing
在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流, (学过EE的人现在可以站出来义正严辞说这个叫“时分复用”了)。

什么,你还没有搞懂“一个请求到来了,nginx使用epoll接收请求的过程是怎样的”, 多看看这个图就了解了。提醒下,ngnix会有很多链接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。

修改系统时间

发表于 2017-09-14 | 更新于 2019-05-06
  1. 修改时区

    1
    $ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  2. 看看时间是否正确若不正确就按如下操作

    1
    2
    $ date {查看目前本地的时间}
    $ hwclock --show {查看硬件的时间}
  3. 如果硬件时间和系统时间不同,那就对硬件的时间进行修改

    1
    2
    3
    4
    5
    6
    $ #设置硬件时间为17年4月17日14点44分15秒
    $ hwclock --set --date '2017-04-17 14:44:15'
    $ #设置系统时间和硬件时间同步
    $ hwclock --hctosys
    $ #保存时钟
    $ clock -w

short与long是限定符,不是基本数据类型

发表于 2017-09-14 | 更新于 2019-05-06

c语言只提供了几种基本数据类型

  • char
  • int
  • float
  • double

而short,long为限定符,用来限定整型,

1
2
short int a;
long int b;

我们平常只是出于习惯把int给省略了。

linux快速删除文件

发表于 2017-08-30 | 更新于 2019-05-06

使用rsync命令。
这也是我被网上的一些资料坑的地方。

坑的过程如下:

第一次使用的命令

1
$ rsync --delete-before -a -H -v /root/test ./bak

其中,bak为要删除的目录,结果执行后,发现./bak目录下的文件没有删除,反而还将/root/test的空目录复制了过来。
后来,多次验证下,才发现应该这么写:

1
$ rsync --delete-before -a -H -v /root/test/ ./bak

Cache和Buffer的区别是什么

发表于 2017-08-05 | 更新于 2019-05-06

Buffer


简单说,Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。

Cache


Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。

总结


所以,如果你注意关心过存储系统的话,你会发现硬盘的读写缓冲/缓存名称是不一样的,叫write-buffer和read-cache。很明显地说出了两者的区别。

centos7以上添加端口

发表于 2017-08-02 | 更新于 2019-05-06
  1. 先查看firewalld是否开启

    1
    $ systemctl status firewalld
  2. 要是没有开启则开启

    1
    $ systemctl start firewalld
  3. 假设添加8000端口

    1
    $ firewall-cmd --permanent --add-port=8000/tcp
  4. 重启firewalld

    1
    $ systemctl restart firewalld
  5. 查看是否正确开启了端口

    1
    $ firewall-cmd --query-port=8000/tcp
  6. firewalld开机自启

    1
    $ systemctl enable firewalld
12345
呐喊

呐喊

真的勇士敢于直面惨淡的人生
45 日志
© 2021 呐喊
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v7.1.1
|