网络编程
如果你要开发的程序基于网络工作,要和其他计算机进行数据交互,就需要学会网络编程.请你思考,网络是什么?
计算机之间相互传输数据,首先需要介质,可以是网线、光纤、无线电波,就能通过电(光)信号进行基本的0和1传输,可以被计算机识别.
同样的100个电信号,50个为一组和20个为一组,得到的信息是不同的,每多少位信号表示什么样的信息,比如,这组数据来自谁,要发给哪一台电脑的哪个程序?
这都需要一个标准,而网络的世界是互联互通的,所以标准也得统一,就诞生出了一套互联网协议(Internet Protocol Suite).
计算机网络的本质就是物理传输介质加上一系列的协议. 并且兼顾现实中网络的概念,即由线路和节点组成.
现在有了网络,就可以传输数据了,我们可以模拟演练 一段用户数据被传输到另一台电脑上需要这个数据的程序 的过程
而在这之前,需要梳理一下传输过程都经历了什么鬼:
为了表述更加容易理解,同时省去我们不太需要的底层通讯知识,以下对各个流程和表述做了不同程度的简化
从发送的角度来看,怎样才能将数据发送到网络?
第一,发送方的计算机的硬件(比如中继器、集线器、网线等)符不符合互联网协议的标准,如果不符合,它就不能连上网络,更不要说传数据给接收方.
第二,发送方必须明确说明,是给网络上的哪一台计算机,这个计算机的哪个服务发送数据包,这个数据包代表什么格式的数据... ...
1.封包
用户使用的都是应用程序,均工作于应用层,应用层协议(application layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文(报文可以理解为数据).
互联网是开发的,大家都可以开发自己的应用程序,提供不同的服务,数据也就多种多样,比如Email、WWW、FTP等等,那么,必须有不同协议规定电子邮件、网页、FTP等数据的组织形式.
一段用户数据(一些二进制数字)就在这一层被加上了一个APPL (application layer)首部,就是告诉接收方,我发送的是一个什么类型的数据.
这是第一次添加,
之后,你需要指明,此数据包是给对方的哪个服务使用,最容易实现的当然就是用数字标识,这里就有一个 端口号的概念,
:端口号范围0-65535,0-1023为系统占用端口,其他的提供给各个应用服务给数据加上端口信息的过程,叫做传输层,遵从 TCP 协议 或UDP 协议,其中TCP协议更安全,但效率较低.
这是第二次添加,采用TCP协议就加上TCP首部.
接着,就需要添加一些指明对方计算机信息的数据了
在早期,计算机数量很少的黑暗年代,添加的信息遵从以太网协议(ethernet),以太网协议是这样规定的:
- 一组电信号构成一个数据包,叫做‘帧’
- 每一数据帧分成:报头head和数据data两部分
head包含:(固定18个字节)
- 发送者/源地址,6个字节
- 接收者/目标地址,6个字节
- 数据类型,6个字节
data包含:(最短46字节,最长1500字节)
head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送
mac地址:
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
添加以太网协议(ethernet) 的这一层叫做数据链路层
如果两台计算机处在同一个局域网,即用交换机、路由器简单建立的连接,他们之间互相识别数据头的 MAC地址:,需要找到对方时,就将自己的数据包发送给这个局域网的交换机,交换机拿到数据,会向此局域网内其他计算机都发送这个数据包,各计算机拿到数据包之后进行拆包,发现MAC地址不是自己,就把数据丢弃,是自己就去处理数据.这种通信方式叫做广播,交换机就是一个大喇叭~~
后来啊,计算机越来越多,所有的计算机都在一个局域网显然是不现实的,数以亿计的计算机同时发送广播给同一台交换机会造成网络的灾难---广播风暴.
于是这些计算机按照线路--节点的方式,一些计算机用交换机连接在同一个子网里,每个子网有自己的识别特征,众多子网又通过硬件连接在一起,这样一层一层的线路---节点的方式,更像一个现实中的网了! 这样再找某台计算机的时候,先找到它所属的子网(广播域),再用广播的方式找到这个计算机.
那么,必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是, 就采用路由的方式(向不同广播域/子网分发数据包)于是引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址.
添加网络地址信息的这个阶段叫做网络层,网络层遵从IP协议.
IP协议:
- 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
- 范围0.0.0.0-255.255.255.255
- 一个ip地址通常写成四段十进制数,例:172.16.10.1
ip地址分成两部分
注意:单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网
例:172.16.10.1与172.16.10.2并不能确定二者处于同一子网
子网掩码
所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,
172.16.10.1:10101100.00010000.00001010.000000001
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0
172.16.10.2:10101100.00010000.00001010.000000010
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0
结果都是172.16.10.0,因此它们在同一个子网络。
总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
ip数据包
ip数据包也分为head和data部分,无须为ip包定义单独的栏位,直接放入以太网包的data部分
head:长度为20到60字节
data:最长为65,515字节。
而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。
这时候,发送方完成传输层的封包后,需要按照IP协议添加表示 IP的信息 ,再按照以太网协议添加 MAC地址的信息
发送过程中,将 ip and 子网掩码 操作后,如果接收方与发送方在同一子网,就用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),遵从ARP协议来处理数据包.
ARP协议:
在通过以太网发送IP数据包时,需要先封装网络层(32位IP地址)、数据链路层(48位MAC地址)的报头,但由于发送时只知道目标IP地址,不知道其MAC地址,所以需要使用地址解析(ARP)协议。使用地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通信的顺利进行。
如:
主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B 发送IP通信了。
这样我们终于能将数据发送到指定的计算机了!
总结一下,
数据进入协议栈时的封装(封包)过程:
最后不要忘了,还有最底层的一层 物理层! 物理层主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0.
在细分过程中,应用层又被分成三层: 应用层,表示层,会话层,会话层结束才进入传输层.
这样就构成了 Open System Interconnection
意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
它事实上已经被TCP/IP4层模型(因特网分层模型)淘汰了,在当今世界上没有大规模使用。但TCP/IP 4层模型传输原理是OSI的简化!
我们记忆的话,可以记忆这四层 :应用层--传输层--网络层--数据链路层--物理层
参考: 《TCP/IP协议详解卷1:协议》
http://www.cnblogs.com/linhaifeng/articles/5937962.html
网络编程-TCP传输数据--封包拆包