• http,socket,进程通信,网络通信(1)


            众所周知,网络通信本质上就是进程间通信,进程间通信有以下常见的通信方式:

            1,管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指父子进程关系.

            2,高级管道通信:将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程

            3,命名管道FIFO:有命名管道也是半双工的通信方式,但它允许无亲缘关系的进程间通信

            4,消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限制等缺点

            5,共享存储ShardMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的.

            6,信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,因此,主要作为进程间以及同一进程内不同线程之间的同步手段

            7,套接字socket:套接字是网络间进程的唯一标识,用于不同机器间进程的通信

            8,信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生

            网络间进程通信

            端口号与进程号

            本地进程通信的唯一标识是ProcessID,由系统内核分配并统一管理,当进程需要访问网络时,才会有端口号,端口号分为公认端口号,范围从0-1023,这些端口号一般固定分配给一些服务(21FTP服务,25SMTP服务,80HTTP服务,135RPC服务)等.动态或私有端口号范围从1024到65535,这些端口号不固定分配给某个服务,只要进程会系统提出访问网络申请,系统可以从这些端口号中分配一个给该程序使用

            面试时可能会考的网络端口号

            20,21--FTP相关

            22--安全服务(SSH)

            23--远程登录(TTS)

            25--电子邮件(SMTP)

            80--超文本服务器(HTTP)

            110--电子邮件(pop3)

            8080--www代理如tomcat

            3306--mysql

            4000--腾讯QQ客户端

            

            

            互联网分层:

            http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

            OSI七层模型:

            1,物理层,2,数据链路层,3,网络层,4传输层,5,会话层,6,表示层,7应用层

            五层模型:

            1,物理层,2,数据链路层,3,网络层,4,传输层,5应用层(应用层+表示层+会话层)

    七层模型和五层模型的区别在于拥有众多协议组成的应用层,5层模型将应用层,表示层会话层看做为应用层

            物理层,

            就是两个电脑用网线连接组成局域网,局域网再组成因特网

            

            数据链路层,

            我们用电线将两个机器连接起来之后,要实现通信,那就要规定一组高低电平(高低电压)组合的含义,电线连接的高低电平在一段时间内是连续的,怎么样才能知道哪个点到哪个点的高低电平算一组数据呢,我们约定给他一个特殊的标记.我们将发送者,接收者,要发送的数据类型等经过二进制编码得出一串二进制序列(01序列)加入到高低电平的传输中,以后在高低电平中遇到这串序列就知道他是一组消息的开头(Head),随后跟着的是所携带的数据(Data).这样一个组合电信号叫做帧(Frame),模型如下

            以太网协议

            以太网协议规定:"标头"的长度,固定为18字节。"数据"的长度,最短为46字节,最长为1500字节。因此,整个"帧"最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。

            MAC地址,广播,

            局域网里电脑多了,数据是向所有电脑发送的(广播),所有电脑都会接收到同样的信号,我要怎么知道,信号来自哪台电脑呢.既然Head包含了发送者和接收者的信息,我们就要给局域网中的每一台电脑命名而且不能重复,这样我们才能知道是谁发给我的,以太网规定连入网络的所有设备都必须有网卡接口,而且世界上的每一个网卡出厂时都有一个世界独一无二的MAC地址,长度为48个二进制位,通常用12个16进制数表示

    这样可以用独一无二的网卡来区别局域网中的电脑.因此我们可以将MAC地址作为发送者和接收者标识.这样所有电脑接收到信号时,自己解析这串信号的的MAC序列是不是自己,如果是自己则进一步解析编码成信息,如果不是发给自己则丢弃,这样就实现了电脑间的通信

            

            网络层:

            理论上,依靠MAC地址,我们就可以用深圳的一台电脑,给硅谷的一台电脑发送信息.但是我们前面说过,这种发送方式是广播的方式,如果这样做,那么全世界的电脑都会收到来自全世界的信息,那是不现实的.因特网是由若干个子网络组成的.

            因此必须找到一种方法能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。("路由"的意思,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。)遗憾的是,MAC地址本身无法做到这一点。它只与厂商有关,与所处网络无关。那么确定计算机所在的子网络就要重新引进一套新的地址,俗称网络地址,简称网址.子网络层面的东西叫做网络层

            IP协议

            规定网络地址的协议叫做IP协议,广泛采用的第四版叫IPv4,中间那层是十进制写法,下面那层是二进制写法,可以计算出他们的范围胡是0.0.0.0一直到255.255.255.255

            一套新地址,给互联网上的每一台电脑都会分配一个IP地址,这个地址分为两部分,前一部分代表网络,后一部分代表主机,如果前面网络部分都相同说明两台计算机在同一个子网络.要怎么判断两台计算机在同一个子网络呢,因为,不同的子网络网络部分的位数不一样,通过子网掩码与IP地址相与计算可以识别,子网掩码是区分子网络的一个参数,例如

            IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,如果是同一个子网络相与之后根子网掩码的网络部分全为1一致,写成十进制就是255.255.255.0

    办公室里最常见的网络问题当然就是,网络地址冲突,网络地址被占用,如果你不能自动获取IP地址,或者局域网IP分配不够用被其他电脑占用,那么你就要手动设置IP地址了,一个局域网一般网络部分是前面24位,因此只要改主机部分,就可以连接上网了,子网掩码自然是,255.255.255.0

            IP数据包,

            之前的包含接受者,发送者,数据类型的Head不变,在data部分添加一个代表IP地址信息的Head即形成了IP数据包,当然如果data数据很大则要分割成多个数据包发送

           

            ARP协议,

            如上图IP数据包,IP数据包会通过网络层和局域网,这两层网络,因此必须同时知道两个地址,一个是对方的IP地址,另一个是对方的MAC地址,通常情况下

            IP地址通过中间DNS解析网址(www.google.com)可以知道对方的IP地址,但是无法知道MAC地址,,所以需要一种机制能够从IP地址得到MAC地址

            这里又可以分成两种情况。

            第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的"网关"(gateway),让网关去处理。

            第二种情况,如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。

            总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。

            传输层

            一台计算机的软件(QQ编辑文字)从深圳发出信息到硅谷,经过如干个局域网,最终来到硅谷一台电脑上,这台电脑接收到可以接受到信息,但是必然是用一种软件来接受,那么我们要知道到底是哪个软件来接受这个数据(QQ消息),那么这个标识进程的参数.电脑上运行着这么多软件(进程),前面我们提到过,进程有一个唯一标识符叫PID,但是如果要连接网络,则会想系统申请端口号(port),前面我们讲过0-1023被约定俗成的服务或者应用所占用,那么普通的程序只能从私有端口中分配端口号;

            传输层的功能就是建立端口到端口的通信,相比之下,网络层的功能是建立主机到主机的通信,只要确定主机和端口号,我们就能实现程序之间的交流(QQ聊天),主机+端口叫做套接字(socket)

            udp协议,

            现在我们要在原来的ip数据包总加入端口信息,因此数据包变成如下

            MAC+IP+Port的三个Head组成的数据包头加上data数据就变成了一个UDP数据包

            

            TCP协议

            UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到.为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

            应用层

            应用程序收到"传输层"的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。"应用层"的作用,就是规定应用程序的数据格式。

            举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层",应用层的协议最广泛的就是,Http协议,SMTP,DNS,FTP,Telnet,SNMP。

            这是最高的一层,直接面对用户。它的数据就放在TCP数据包的"数据"部分。因此,现在的以太网的数据包就变成下面这样。

    下篇将会着重讲述应用层几个协议,下篇名词,http,长连接,短连接,DNS,

    将会解释,浏览器从输入网址到响应的过程

     https://mp.weixin.qq.com/s?__biz=MzI4NTEzMjc5Mw==&mid=2650554715&idx=1&sn=6f5fdf99f33633c9cc4f97904d1209f6&chksm=f3f833cdc48fbadb5921a3c08451fcf5091dc57182c9d1555eebe6890ea8543f498eb9df683e#rd

  • 相关阅读:
    使用Fiddler模拟客户端http响应
    Vim显示行号
    Convert int to byte array
    bare linefeeds received in ASCII mode
    Memory Analyse Tool
    what is the difference between static and normal variables in c++
    Looper Could not create wake pip
    Convert Java Doc to CHM using jd2chm
    ARM(RISC)和x86(CISC)的技术差异
    处理器架构——从RISC与CISC到x86、ARM、MIPS
  • 原文地址:https://www.cnblogs.com/qq289736032/p/9253061.html
Copyright © 2020-2023  润新知