互联网协议初探
如今的互联网四通八达,那么传输数据的时候怎么样才能保证点对点的传输完成呢?传输的数据流格式又怎么保证呢?
比如说我对于另一台电脑发送一条长为100字节的信息,那么那些字节是表示接受方的ip及端口这些东西呢?这就需要一个统一的规定。互联网协议就是干的这些事。
首先我们了解一下互联网传输大概可以分成5层。
实体层--连接层--网络层--传输层--应用层
实体层:就是直接拉网线连接之类的物理手段,用于传输电信号。
连接层:光有电信号没用,要对这些信号做出一定规定才能使这些信号有意义。现在连接层的主要协议是“以太网”协议,以太网协议将电信号规定成两部分,标头和数据。数据就是你要传输的东西,标头上就是储存了发送者,接受者,数据类型的信息。以太网协议规定一组电信号构成一个包,即标头加数据。标头占固定18字节,数据的长度最短46,最长1500字节。那么在连接层是怎么确定发送者和接受者的呢?就是依据你电脑网卡的mac地址确定的。每块网卡出厂时都会带有一个唯一的mac地址,长度为48个二进制位,常用12个十六进制数表示,如:4A-2B-32-AC-10-0A。有了mac地址就能确定每个包是谁发给谁的了。所以以太网发送信息必须知道另一块网卡的mac地址。
网络层:知道了mac地址,但是互联网仍然不知道某一个包到底要发给哪台电脑。这怎么办?这时网络采用了很原始的办法,向每一台计算机都发送一个包,让你计算机自己判断是否丢弃这个包(广播的发送方式)。如果计算机A收到了一个给B的包,这时A发现接受者的mac地址和自己不一致,就会丢弃掉这个包。但是显而易见这种方式效率是十分低下的,并且一个子网络只能向同一个子网络发包。所以这个时候就引入了网络地址(网址),网址与mac地址完全无关。假使A要向B发送一个包,如果A和B在一个子网络里,就通过广播发送,否则就经由网关路由发送。规定网络地址的协议就叫ip协议。目前泛用的是第四版,即 ipv4 协议。ipv4协议规定IP地址长为32个二进制位,常用4个十进制数表示如 :192.168.1.104。不过现在网络地址数量有些吃紧,所以 ipv6 也慢慢开始用起来了。ipv6使用的是128位的地址,可以用8组4位十六进制数表示如:2001:0db8:85a3:08d3:1319:8a2e:0370:7344。IP地址分两部分,网络部分和主机部分,两个主机如果在同一个子网络内,他们的网络部分一定是相同的。那么我们怎么确定前几位是网络部分呢?为了解决这个问题引入了子网掩码的概念。子网掩码是一段连续1和一段连续0组成的,要获取主机所在子网络只用将ip地址与子网掩码进行与运算即可。要通过ip协议传输信息的话,那么数据包内一定要包含ip地址,而IP包也包含标头和数据两部分,实际上这时ip包就相当于以太网包的数据。简言之这时一个包的组成就是 以太网标头 + ip标头 + 数据 这种结构了。IP包的标头是20到60字节,整个ip包的长度为65535字节,而以太网包的数据最长只有1500字节,所以如果ip包过大的话会自动进行分片发送。
有了网络层,主机的信息交换就可以完成了。等等,还有一个问题,一般来说计算机A要发送信息给B,那么A是知道B的ip地址的(网址如“www.baidu.com”这种格式由于dns协议,经过dns的解析之后还是一个ip地址),但是A一般是不会知道B的mac地址的。这里就有一个新协议arp协议,arp协议可以允许通过ip地址查询mac地址。如果两个主机不是在一个子网络的话就发给网关进行处理,如果在同一个子网络的话就会发送一个标头内包含接受者IP地址和mac地址为FF-FF-FF-FF-FF-FF的包,表示这是一个广播地址。这时这个子网络中每一个主机都会取出ip地址与自己的ip比较,如果相同的话就返回一个包含自己mac地址的包,否则丢弃。
传输层: 光有主机之间的通信还不够。一台主机上可能同时运行了很多个应用程序,主机A接受到了一个包,它怎么知道这个包是给哪个应用的呢?也就是说我们还需要另一个表示不同应用的信息,这个信息就是端口号。端口号是0到65535间的一个整数,其中0到1023的端口是系统端口,用户只能选用其他端口。
针对端口常见的有udp协议和tcp协议。
udp协议比较简单,就是直接将ip包内的数据里嵌入一个端口号相关的地址,也是长成 标头 + 数据 的这种结构。由于这种简单的结构,udp包的发送不需要两个主机间建立起稳定的连接,同样的udp包发送后无法确认对方是否成功接受。就是说udp包就是 我给你发包,与你无关 这种感觉。而tcp的结构也是 标头 + 数据 ,但是tcp的标头就要复杂一些。具体内容我还不清楚,不过tcp包发送很安全,可以确认对方是否接受到,并且接受乱序也影响不大,因为tcp包可以自己调整顺序。udp包可以正好放入一个ip包,而tcp包理论可以无限长,但是过长的话还是要分片发送的。
应用层 :应用层的协议就五花八门了,主要是规范 udp/tcp 包里数据的格式,根据应用程序的不同采取的协议也可能不同。