网络编程

网络的分层

 图一网络不同层的协议 1

主机网络层:

定义了特定的网络接口如以太网或是wifi天线通过物理连接向本地网络或是世界发送IP数据报。

际层:

也叫网络层,网际层定义了包(也称为数据报)与寻址机制。IP也是网络层协议,java唯一理解的网络层协议。

IP协议现在变成了两个协议:

IPv4 和 IPv6。 IPv4 是32位,IPv6是128位

数据报结构1

网际层的主要作用:1.数据报,路由,寻址。2.支持不同类型的主机网络层相互对话

见附录。

传输层:

主要是两个协议:

TCP 关键字:重传,有序。(可靠协议)

UDP关键字:只允许检测(不可靠协议)

应用层

向用户传输数据

应用层确定了数据传输后的操作,也是占时最长的层,确保正确解析数据。

例如:

IP、TCP和UDP

具体报文结构请看:网络报文简要图解

链接:http://blog.csdn.NET/qq_26816591/article/details/53022183

也可查看官方英文版本:http://www.networksorcery.com/enp/protocol/ip.htm

关键词:

IP网际协议是由军方资助开发的

Java只支持TCP UDP 及其之上的协议

TCP开销较大,可靠,准确,耗时。

UDP不可靠,实际使用广泛,因为:丢失少量信息不影响整体,且获取速度快。

IP地址与域名DNS

IPv4中规定IP地址长度为32,即有2^32-1个地址(2^32差不多40亿,远远不够入网设备数量)

IPv6中IP地址的长度为128,即有2^128-1个地址(2^128 差不多地球上每一粒沙子都会分配到IP地址)

IPv4的地址是由32位二进制码组成。

格式为:xxx.xxx.xxx.xxx,

其中的x代表的是一个三位的二进制数字。

 IPv6 地址表示为:

xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,

其中每个 x 是代表一个 4 位的十六进制数字。

IPv6 地址从 0000:0000:0000:0000:0000:0000:0000:0000 至 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff。

域名的出现主要是解决人类记忆的问题:

大家都会去记www.baidu.com这个多好记,谁会去记 208.201.239.101这样毫无联系的一串数字。

Java中解释主机名与数字地址的方法在 java.Net.InetAddress类中。

还有一些

特殊的IP

如:

0.0.0.0:三无容器(任何缺省ip都会放到这里,更像一个集合,不能再说是ip地址)。

255.255.255.255:四个字节都使用相同的数字(如128.128.128.128)。限制广播地址(同一广播域,广播使用,不能被路由转发)。

127.0.0.1:本机地址(别名:localhost 主要用于测试)。

10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x:这类地址只能使用在内部网,而不被允许加入Internet,上网是通过NAT(地址翻译成合法公用地址进行上网)。例如:实验室机器。

224.0.0.1:组播地址,从224.0.0.0到239.255.255.255.。

224.0.0.1特指所有主机,224.0.0.2特指所有路由器。

169.254.x.x :如果你的主机使用了DHCP功能自动获得一个IP地址,那么当你的DHCP服务器发生故障,或响应时间太长而超出了一个系统规定的时间,Wingdows系统会为你分配这样一个地址。如果你发现你的主机IP地址是一个诸如此类的地址,很不幸,十有八九是你的网络不能正常运行了。

端口:(每个传输层协议有65535个端口)

正因为有很多并且将有更多的程序要通过网络进行通讯,而所有信息实际上都要由网卡那一个接口出入,那么如何区分出入的信息是给哪个程序使用的呢?这个任务交由操作系统处理,而它所采用的机制就是分了65536个端口编号,程序在发送的信息中加入端口编号,而操作系统在接收到信息后会按照端口号将信息分流到当前内存中使用该端口号的程序。简单说,网络是火车,信息是人流,端口号是接站牌。

系统常见端口号可以自行查看:系统常见端口的常见协议及用途.

1.      Internet:是世界上最大的基于IP的网络。

2.      Internet地址分块:IP是通过ISP(网络服务商)提供的

网络地址转换:

NAT 由本地网络连接到ISP路由器然后转换成可路由地址。

路由器换件事出站入站连接,,调整IP包中的地址。对于出站的包,会将原地址改为路由器的外部地址。对于入站的包,会将目的地址,改为本地地址。值得注意的是:未来会普及的IPv6会使得,NAT毫无意义。

防火墙:

过滤规则是基于网络地址和端口的。一般只工作在传输层和网际层。

代理服务器:最大的优点是外部主机只能看到代理服务器,不会知道内部机器的主机名和IP。通常只工作在应用层。代理服务器还能够实现本地缓冲,大大提高了大量集中访问时的访问速度。其最大局限性在于,它不能支持所有的协议,如最新更新的协议,BitTorrent ,这在快速发展的网络世界,很是受限。

客户/服务器模型

Internet标准

主要有两个制定机构:IETF 和 W3C

IETFRFC

 IETF 是一种民间团体,是一种遵循多数人意见的标准制定机构。其标准有:TCP/IP、MIME、SMTP。

W3C

W3C是一种厂商组织,标准制定由缴纳会员费的公司成员控制的,拒绝个人参与。并且,每一项标准最后都要由一个人批准或是否决,那就是HTTP之父,W3C总裁Tim Berners Lee

其标准有:HTTP、HTML、XML。

IETF虽说是征求大多数人意见的标准,但是在征求之前早就完成标准制定工作了,相比之下IETF更加民主。但是现实情况确是W3C的工作要更出色,不然H5也不会这么火爆。

附录:

图(英文)

图(中文)

版本号(Version):长度4比特。标识目前采用的IP协议的版本号。

一般的值为0100(IPv4),0110(IPv6)

IP包头长度(Header Length):长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8*4),因此,一个IP包头的长度最长为“1111”,即15*4=60个字节。IP包头最小长度为20字节。

服务类型(Type of Service):长度8比特。8位 按位被如下定义 PPP DTRC0

PPP:定义包的优先级,取值越大数据越重要

000 普通 (Routine)

001 优先的 (Priority)

010 立即的发送(Immediate)

011 闪电式的 (Flash)

100 比闪电还闪电式的(Flash Override)

101 CRI/TIC/ECP(找不到这个词的翻译)

110 网间控制(Internetwork Control)

111 网络控制 (NetworkControl)

 

D 时延: 0:普通 1:延迟尽量小

T 吞吐量: 0:普通 1:流量尽量大

R 可靠性: 0:普通 1:可靠性尽量大

M 传输成本: 0:普通 1:成本尽量小

0 最后一位被保留,恒定为0

IP包总长(Total Length):长度16比特。以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。

标识符(Identifier):长度16比特。该字段和Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。

标记(Flags):长度3比特。该字段第一位不使用。第二位是DF(Don’tFragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(MoreFragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。

片偏移(Fragment Offset):长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。

生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。

协议(Protocol):长度8比特。标识了上层所使用的协议。

以下是比较常用的协议号:

1    ICMP

2    IGMP

6    TCP

17    UDP

88    IGRP

89    OSPF

头部校验(Header Checksum):长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。

起源和目标地址(Sourceand Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

至此,IP包头基本的20字节已介绍完毕,此后部分属于可选项,不是必须的部分。

可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:

松散源路由(Loosesource routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。

严格源路由(Strictsource routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。

路由记录(Recordroute):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。

时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。

填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。

 

 

以太网数据报如下表结构所示

目地地址(6B)原地址 (6B)类型 (2B)

数据 (46~1500B)校验和 (4B)

IP数据报结构如下页表

版本号(4位) 头长度(4位) 服务类型TOS(8位) 总长度(16位)

标示(16位) 标志(3位) 头偏移(13位)

生存时间TTL(8位)上层协议标示(8位) 头部校验和(16位)

源IP地址(32位)目的IP地址(32位)选项 数据

TCP报文结构如下表

TCP源端口号(16位) TCP目的端口号(16位)

系列号(32位)确认号(32位)首部长度(4位) 保留位(6位)

URG          ACK      PSH      RST        SYN F

IN 窗口大小(16位)检验和(16位) 紧急指针(16位)

选项+填充 数据区

UDP报文结构如下表

UDP源端口号(16位) UDP目标端口号(16位)UDP长度(16位)UDP校验和(16位)

数据区(Data)

未经允许不得转载:JX BLOG » 网络编程

赞 (0)

评论 0

评论前必须登录!

登陆 注册