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