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

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

http,socket,进程通信,网络通信(1)的更多相关文章

  1. Socket进程通信机制及应用

    Socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通过套接字向网络发出请求或者应答网络请求.Socket即不是一个程序,也不是一个协议,其只是操作系统提供的通信层的一 ...

  2. Socket进程通信机制

    1.Socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄. 2.应用程序通过套接字向网络发出请求或者应答网络请求. 3.Socket既不是一个程序,也不是一种协议,其只是操作系统 ...

  3. 操作系统-进程通信(信号量、匿名管道、命名管道、Socket)

    进程通信(信号量.匿名管道.命名管道.Socket) 具体的概念就没必要说了,参考以下链接. 信号量 匿名管道 命名管道 Socket Source Code: 1. 信号量(生产者消费者问题) #i ...

  4. [Socket]Socket进程间的通信

    转自:http://blog.csdn.net/giantpoplar/article/details/47657303 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket ...

  5. Android 进阶12:进程通信之 Socket (顺便回顾 TCP UDP)

    不要害怕困难,这是你进步的机会! 读完本文你将了解: OSI 七层网络模型 TCPIP 四层模型 TCP 协议 TCP 的三次握手 TCP 的四次挥手 UDP 协议 Socket 简介 Socket ...

  6. 进程通信(socket)

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  7. 使用Socket进行通信

    客户端通常可使用Socket的构造器来连接到指定服务器,Socket通常可使用如下两个构造器. Socket(lnetAddress/String  remoteAddress , int  port ...

  8. 初识网络进程通信<Heart.X.Raid>

    可以这样说:我们在网络上只做一件事,利用各种软件没完没了的相互通信. 对于单机系统而言,进程在系统中有自己唯一的进程号.但在网络环境下,各主机独立分配的进程号不能唯一标识该进程.例如,主机A赋于某进程 ...

  9. Linux之进程通信20160720

    好久没更新了,今天主要说一下Linux的进程通信,后续Linux方面的更新应该会变缓,因为最近在看Java和安卓方面的知识,后续会根据学习成果不断分享更新Java和安卓的方面的知识~ Linux进程通 ...

随机推荐

  1. Win64 驱动内核编程-33.枚举与删除对象回调

    转载:http://www.voidcn.com/article/p-wulgeluy-bao.html 枚举与删除对象回调 对象回调存储在对应对象结构体里,简单来说,就是存储在 ObjectType ...

  2. 使用抓包工具将抓到的接口存放Jmeter中

    1. jmeter工作台新增 HTTP代理服务器.端口设置为:8888 2. 抓包工具上面设置代理服务器地址 3.代理服务器未启动时,抓包工具界面显示无法联网. 4.在Jmeter中点击[启动]HTT ...

  3. 百度URL参数解析

    在用Python爬取百度搜索的内容时,发现百度搜索的url非常的长,往往会跟一大段的参数,但其实很多参数都是没有必要的,如同样是搜索java关键字,可以通过 http://www.baidu.com/ ...

  4. 如何在jupyter中使用Python2和Python3

    首先通过 pip2 install ipython notebook pip3 install ipython notebook 分别安装ipython notebook,安装命令还是推荐使用国内的豆 ...

  5. proc 下创建与应用交互的可读写节点

    内核版本:Linux-4.14 随便写了个 proc 下节点的测试程序,可以用来与应用层交互. 也可以单独的用来做调试打印使用,例如封装个 my_printk 将信息单独存在节点内,然后可以在应用层 ...

  6. PHP防止sql语句注入终极解决方案(包含pdo各种操作使用实例)

    PHP防止sql语句注入终极解决方案完美解决方案就是使用拥有Prepared Statement机制(预处理sql)的PDO //先做个实验 先不用预处理sql写法<pre><?ph ...

  7. Linux crontab 查看所有用户的crontab任务

    查看所有用户的crontab任务 - mlzhu007的专栏 - CSDN博客 https://blog.csdn.net/mlzhu007/article/details/81662091 以roo ...

  8. centos7双网卡绑定

    # 概念 服务器存在多块网卡时,可以通过bond来实现多块网卡并在一起使用: # 模式 mode 0:load balancing (round-robin) Support:需要Switch支持 & ...

  9. Redis缓存雪崩、击穿、穿透

    参考大佬 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联网公司面一次拿一次offer的面霸(请允 ...

  10. [cf 1194 D] 1-2-K Game

    (当时让这道sb题卡住了,我比sb还sb) 题意: n个东西,两个人轮流取,每次可以取走1个,2个或k个,不能取的人输,求谁必胜. $0\leq n \leq 10^{9},3\leq k \leq ...