C#网络编程(一、七层网络模型)

来源:互联网 发布:macbook藏文件软件 编辑:程序博客网 时间:2024/05/18 13:12

参考链接:Learning Hard的专栏http://blog.csdn.net/learning_hard/article/details/9004936

参考书籍:Unity网络游戏实战--罗培宇,各大商场均有销售。本文为读上几篇文章个人笔记。


一、网络基础

计算机网络是指将多台计算机连接起来,以实现资源共享和信息传递。网络游戏大多使用TCP/IP协议的BS(客户端-服务器)结构,因此开发网络游戏需要一套客户端程序+一套服务器程序。客户端程序运行在用户电脑或手机上,服务端程序运行在游戏运行商的服务器上。

通信架构:



如:在一款多人在线游戏中,玩家A移动,玩家B在自己的设备上也会看到玩家A移动过程。主要步骤如下:

1/  玩家A移动

2/  客户端A向服务端发送新的坐标信息

3/  服务端处理消息

4/  服务端将玩家A的新坐标转发给客户端B

5/  客户端B收到消息并更新玩家A的位置


二、网络分层

网络上的计算机之所以可以互相通信,是因为它们之间都遵守互相都可以“认识”的互联网协议(就如同人交流一样,两个人能够交流,互相必须知道对象的语言)。

互联网上的计算机互相通信又归根于网络中层与层之间的通信,国际标准化组织(ISO)制定了OSI模型,把网络通信分成以下七层。

七层网络模型说明:

1/ 应用层:应用程序提供的服务。

2/ 表示层:格式化数据,以便为应用程序提供通用接口。

3/ 会话层:在两个节点之间建立端连接。


4/ 传输层:面向连接或无连接的常规数据递送,TCP和UDP协议属于传输层协议。

5/ 网络层:通过寻址来建立两个节点之间的连接,IP协议属于网络层协议。

6/ 数据链路层:将数据分帧,添加校验机制,并处理流控制。

7/ 物理层:原始比特流的传输。


其中应用层、表示层、会话层统称为应用层,没有明确界限,应用层一般由程序开发者实现;传输层、网络层、数据链路层和物理层为底层,由操作系统提供。


三、各层的协议

网络中的计算机互相通信就是实现了层与层之间的通信,要实现层与层之间的通信,则各层都要遵守规则,这样才能完成更好的通信, 我们就把它们之间遵守的规则就叫个“协议”,然而网络上的五层之间遵守的协议不一样,每层都有各自的协议。下面就结合案例“客户端向服务器发送'hello'”,由上至下的讲述每层的协议:


1/ 应用层

应用层是模型中的最顶层,是用户与网络的接口,该层的功能是应用程序提供的功能。通过应用程序来完成网络用户的应用需求。该层的数据放在TCP数据包的数据部分,该层定义了一个很重要的协议——Http协议,我们一般的Web开发都是基于应用层的开发。理解Http协议可以帮助我们理解Asp.Net的请求响应模型以及帮助我们自定义发出请求和自定义服务器。

在发送“hello”的例子中,用户把字符串“hello”转化成二进制流传递给传输层:hello=>110110001100101110110011011001101111


2/  传输层

通过MAC和IP地址,我们可以找到互联网上任意两台主机来建立通信。然而这里有一个问题,找到主机后,主机上有很多程序都需要用到网络,比如说你在一边听歌和好用QQ聊天, 当网络上发送来一个数据包时, 是怎么知道它是表示聊天的内容还是歌曲的内容的, 这时候就需要一个参数来表示这个数据包是发送给那个程序(进程)来使用的,这个参数我们就叫做端口号,主机上用端口号来标识不同的程序(进程),端口是0到65535之间的一个整数,0到1023的端口被系统占用,用户只能选择大于1023的端口。

传输层的功能就是建立端口到端口的通信,网络层就是建立主机与主机的通信,这样如果我们确定了主机和端口,这样就可以实现程序之间的通信了。我们所说的Socket编程就是通过代码来实现传输层之间的通信。因为初始化Socket类对象要指定IP地址和端口号。

在传输层有两个非常重要的协议:UDP 协议和TCP协议

采用UDP协议话传输的就是UDP数据包,同样UDP数据包也由头和数据两部分组成,头部分主要标识了发送端口和接受端口,数据部分就是具体的内容信息。同样UDP数据包是放入IP数据包中的"数据"部分,IP数据包再放入数据帧中在网络上传输。

由于UDP协议的可靠性差(数据发送后无法确定对方是否收到),所以又定义了一个可靠性高的协议——TCP协议TCP协议采取了握手的方式要确保对方收到了数据

TCP提供了IP环境下的数据可靠性传输,它实现了数据流传输、可靠性校验、流量控制等功能

TCP有个机制:向服务器发送消息并指定一个唯一编号,服务器收到后需要告诉客户端我收到了你的这个消息,然后客户端再告诉服务器我知道你收到了我的消息(三次握手)。

这个可以确保对方收到了信息(或者明确知道对方无法收到信息),为了实现此机制,需要在数据中添加"信件编号"等信息,也就是添加一个一个TCP首部:

TCP首部 | 11011000110010111011001101100110111


3/ 网络层

该层通过寻址(寻址地址)来建立两个节点之间的连接,大家都知道我们的电脑连接上网络后都一个IP地址,我们可以通过IP地址来确定不同的计算机是否在同一个子网路。如果我们的电脑连接上网络后就有两种地址:物理地址和网络地址(IP地址),网络上的计算机要通信,必须要知道通信的计算机“在哪里”, 首先通过网络地址来判断是否处于同一个子网络,然后再对物理地址(MAC)地址进行处理,从而准确确定要通信计算机的位置。

在网络层中有我们熟悉的:IP协议(即规定网络地址的协议),目前广泛采用的是IP协议第四版(IPv4),这个版本规定,网络地址由32位二进制位组成。我们可以自己配置IP地址也可以自动获得的方式得到IP地址,Ip地址分成两部分,前24位代表网络,后8位代表主机号, 如192.168.254.1和192.168.254.2就处于同一个子网络里,因为这两个IP地址的前24位相同。

IP协议用于将多个包的交换网络连接起来,他在源地址和目的地址之间传送数据包,它还提供对数据进行重新组装的功能,以适应不同网络对包大小的不同要求;
IP数据包也包括两部分:头(Head)和数据(Data),IP数据包放进数据帧中的数据部分进行传输。


以飞鸽传书为例,因为各自飞行距离有限,如果要写信给远方的亲戚,你需要在信封上写上目的地。鸽子飞到中继站休息时,再由中继站的工作人员放出另一只各自帮你送信。有时信件太重,工作人员会把信件拆成两封,再派出两只各自送去。

同理,IP协议会给数据加上目的地地址(IP地址和端口)等信息,必要时还会拆分数据:

       IP首部|TCP首部|1101000110010          IP首部|1110110011011001101111


4/ 数据链路层

传输中若发生差错,为了达成只将有错的有限数据进行重发,数据链路层将比特流组合成帧,然后以帧为单位进行传送。

该层对接受到物理层传输过来的比特流进行分组一组电信号构成的数据包,就叫做"帧",数据链链路层就是来传输以"帧"为单位的数据包,把数据传递给上一层(网络层),帧数据由两部分组成:帧头和帧数据,帧头包括接受方物理地址(就是网卡的地址)和其他的网络信息,帧数据就是要传输的数据体:

      帧首部|数据     帧首部|数据    帧首部|数据

每个帧除了要传送数据外,还包括校验码,以使接收方能发现传输中的差错。比如奇偶校验码是在原信息的最后添加一位用于奇校验或偶校验的代码。如原始信息为10010,因为1的个数为2,所以会在后面添加一个0,形成100100。如原始信息为11010,因为1的个数为3,所以要在后面添加一个1,形成110101。对端程序只要检测最后一位,便能够初步判定数据是否正确发送,若不正确则要求重发。   可见: 数据链路层会拆分数据并添加一些额外数据。

数据帧的最长为1500字节,如果数据很长,就必须分割成多个帧进行发送。


5/ 物理层

物理层是五层模型中的最底层,物理层为计算机之间的数据通信提供了传输媒体和互连设备,为数据传输提供了可靠的环境,媒体包括电缆、光纤、无线信道等,

互连设备指是计算机和调制解调器之间的互连设备,如各种插头、插座等。该层的作用是透明的传输比特流(即二进制流)为数据链路层提供一个传输原始比特流的物理连接。
这些数据通过物理介质传输到目的地,目的地再依照与上述相反的过程进行解析,最后得到字符串"hello".


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

案例:

现在通过一个简单的访问网页的例子来说明网络中的通信:Learning Hard的专栏 http://blog.csdn.net/learning_hard/article/details/9004936

当我们在浏览器中输入www.baidu.com时,这意味着浏览器要向百度发送一个网页数据包,要发送数据包,需要知道对方的IP地址,这里我们只知道网址为www.baidu.com,却不知道IP地址,此时应用层协议DNS协议会帮我们把网址解析为IP地址,此时会发送一个DNS数据包给DNS服务器,DNS服务器再做出响应来告诉我们百度的IP地址为220.181.111.147,这样我们就知道百度(我们需要通信的主机)的IP地址。

应用层:

 浏览网页采用的是HTTP 协议,HTTP数据包会嵌入在TCP数据包中,此时我们发送的HTTP数据包内容为:

[plain] view plain copy print?GET http://www.baidu.com/ HTTP/1.1  Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*  Accept-Language: en-US  User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Zune 4.7; InfoPath.3; MS-RTC LM 8)  Accept-Encoding: gzip, deflate, peerdist  Proxy-Connection: Keep-Alive  Host: www.baidu.com  Cookie:(太长省略)X-P2P-PeerDist: Version=1.0  

传输层:

TCP数据包需要设置端口,接收方(百度)的Http端口默认是80,本机的端口是一个1024-65535之间的随机整数,这里假设为1025,这样TCP数据包由标头(标识着发方和接收方的端口信息)+HTTP数据包,这样TCP数据包再嵌入IP数据包中在网络上传送

网络层:

IP数据包需要知道双方的IP地址,本机IP地址假定为192.168.1.5,接受方IP地址为220.181.111.147(百度),这样IP数据包由头部(IP地址信息)+TCP数据包,

数据链路层:

IP数据包嵌入到数据帧(以太网数据包)中,以太网数据包需要知道双方的MAC(物理地址),发送方为本机的网卡地址,接受方为网关192.168.1.1的MAC地址(通过ARP地址解析协议得到的)。这样数据帧由头部(MAC地址)+IP数据包组成。

经过多个网关的转发到百度服务器220.181.111.147,服务器接受到发送过来的以太网数据包,然后再从以太网数据包中提取IP数据包——>TCP数据包——>HTTP数据包,最后服务器做出"HTTP响应",再用TCP协议发回给客户端(浏览器),浏览器同样的过程读取到HTTP响应的内容(HTTP响应数据包),然后浏览器对接受到的HTML页面进行解析,把网页显示出来呈现给用户,这样就完成了一次网络通信了。