﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-柳岸晓风-随笔分类-网络学习</title><link>http://www.cppblog.com/Geek/category/12672.html</link><description>/*c/c++ 算法 网络 游戏编程*/ 
/*coding无难事，只怕有心人*/</description><language>zh-cn</language><lastBuildDate>Wed, 30 Jun 2010 05:27:17 GMT</lastBuildDate><pubDate>Wed, 30 Jun 2010 05:27:17 GMT</pubDate><ttl>60</ttl><item><title>Windows网络程序设计基础知识拾掇（二）</title><link>http://www.cppblog.com/Geek/archive/2010/06/28/118875.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Mon, 28 Jun 2010 10:23:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2010/06/28/118875.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/118875.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2010/06/28/118875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/118875.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/118875.html</trackback:ping><description><![CDATA[<p>1。地址解析<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址解析（Address Resolution）就是将计算机中的协议地址翻译成物理地址（或称MAC地址）。地址解析只能在本地网进行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址解析技术分为如下几种：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）表查询（Table-Lookup）。该方法适合广域网（WAN），通过建立映射数组（协议地址--物理地址）的方法查询。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）相近形式计算（Close Form-Compute）。该方法适用于可以自行配置的网络，IP地址和物理地址相互对应，例如：&nbsp; 220.123.5.1 &#8211;&gt;xxx1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 220.123.5.2-&gt;xxx2<br>可通过这种方法得到物理地址：物理地址=协议地址&amp;0xFF。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）信息交换（Message-Exchange）。该方法适用于局域网（LAN），是基于分布式的处理方式，即主机发送一个解析请求，一广播的形式发出，并等待网络各个主机的响应。</p>
<p>2。数据包的封装和分用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当应用程序用TCP传送数据时，数据被送入协议栈中，然后逐个通过每一层，直到当作一串比特流传送如网络。其中每一层收到数据都要增加一些首部信息（有时还要增加尾部信息）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以太网的帧的长度必须在46~1518字节之间。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IP在首部中存入一个长度为8bit的数据，称作协议域。1表示ICMP，2表示IGMP，6表示TCP，17表示UDP。</p>
<p>3。以太网数据链路层帧结构</p>
<p align="center">&nbsp; |前导符 |起始帧分界符&nbsp;&nbsp; |目标地址 |源地址&nbsp; |长度/类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | CRC <br>&nbsp;&nbsp;&nbsp; |7byte |1byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |6byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |6byte &nbsp;&nbsp;&nbsp;&nbsp; |2byte &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |46--1500byte&nbsp; | 4byte<br>IEEE802.3MAC帧结构</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前导符（Preamble）：其中1和0交替出现，警告接收系统即将有数据帧到来，同时同步系统时序。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 起始帧分界符（SFD）：一个字节，为10101011，标志帧的开始。SFD通知接收方后面所有的内容都是数据。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目标地址（Destination Address）：包含数据帧的目的物理地址。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 源地址（Source Address）：包含转发数据帧的最后一个设备的物理地址。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDU的长度/类型(Length/Type):该字段指出PDU的长度或封装的数据类型。当PDU的长度固定式，这个字段用来表示数据类型，如IP（0x0800)、ARP(0x0806)、RARP(0x8035)等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据：保存高层协议的数据（PDU）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRC：IEEE802.3MAC帧的最后一个字段是检错信息，通常为CRC-32。</p>
<p>4。IP</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IP复杂在TCP/IP提供数据报服务，进行数据的封装及产生协议头。由于以太网帧的大小要受限制，并且不同的帧可能由不同的网络路径传送，因此IP协议需要将较大的数据报文分割开来，并且在目的主机处按正确的顺序组合。但是，IP协议不负责包的校验，它是一种无连接，不可靠的服务。如果发生错误，IP协议则丢弃该数据报，然后发送ICMP消息报给信源端。此外，IP协议还有负责寻找路由，因此还需要配套一个确定的IP地址。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IP数据报时Internet上数据的通信的基本单元，这些数据不超过1000字节才。</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_2.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_thumb.png" border="0" height="220" width="556"></a> </p>
<p align="center">IP数据报格式</p>
<p align="left">&nbsp;&nbsp;&nbsp; *版本(VERS):指定IP协议的版本号，对于IPv4来说，版本为4。<br>&nbsp;&nbsp;&nbsp; *报头长度（HLENS）：指定IP报头的长度，以字为单位，范围5-15个word。<br>&nbsp;&nbsp;&nbsp; *服务类型（ToS）：表示数据报的服务类型，即处理的优先级，包括延时，吞吐量，可靠性或代价。<br>&nbsp;&nbsp;&nbsp; *报文总长度（Total Length）：IP数据报最大为65535字节，网络主机可以使用数据报长度来确定一个数据报的结束和下一个数据报的开始；当传送长度超过65535字节的IP数据报时，大多数的链路层都会分片。主机一般要求接收的数据报不超过576字节。<br>&nbsp;&nbsp;&nbsp;&nbsp; *标识符（ID）：该16位标识符由产生它的主机唯一指定给数据报，分段后的数据报享同一个数据报共享一个数据报ID。<br>&nbsp;&nbsp;&nbsp; *标识（FLG）：包括3个1位标志，标识报文是否允许被分段和是否可以被分段。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一位保留并设为0。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二位0表示报文可以被分段，1表示报文不能被分段。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三位只有在第一位为0时才有意义，这一位标识次报文是否是这一系列分段的最后一个，0表示报文时最后一个。<br>&nbsp;&nbsp;&nbsp;&nbsp; *分段偏移量（Fragment Offset）：指定分段在整个数据报中的位置。<br>&nbsp;&nbsp;&nbsp;&nbsp; *生命周期（TTL）：代表数据报被丢弃前能够穿越的最大主机跳数。TTL的初始值由源主机设置，其理论最大值为255，每经过一个处理节点减1。当该字段为0时，报文就被认为是不可转发，之后产生一个ICMP报文发回源主机，并丢弃不可转发的报文。<br>&nbsp;&nbsp;&nbsp;&nbsp; *协议（Protocol):主要标识上层协议的类型，一般是指TCP协议、UDP协议、ICMP协议和IGMP协议。<br>&nbsp;&nbsp; *头校验和（Header Checksum):目的是保证头的正确性，目的机和网络中每个网关都要重新计算报头的校验和，如果计算出校验和与报文所含的校验和不同，则丢弃该报文。<br>&nbsp;&nbsp;&nbsp; *源IP地址（Source IP Address）：指明数据报的发送地址。<br>&nbsp;&nbsp;&nbsp; *目的IP地址（Destination IP Address）：指明数据报接收方的地址。<br>&nbsp;&nbsp;&nbsp; *选项（Options）：在IPv4中，主要用于网络测试和调试。<br>&nbsp;&nbsp; *填充区（Padding）：为了保证IP头长度是32为整数倍，要填充额外的0。</p>
<p align="left">&nbsp;&nbsp;&nbsp; IP协议时TCP和UDP的基础。ICMP和IGMP是IP层协议的附属协议。</p>
<p align="left">5。TCP（Transmission Control Protocol）</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp; TCP提供一个完全可靠地、面向连接的、全双工的流传输服务。</p>
<p align="left"><a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_4.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_thumb_1.png" border="0" height="276" width="560"></a> </p>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCP段格式<br>&nbsp;&nbsp; *源端口：16bit源端口指的是发起通信的端口号。<br>&nbsp;&nbsp; *目的端口：16bit目的端口指的是传输目的地的端口号。<br>&nbsp;&nbsp; *序号：该序号是32bit的无符号数，到达2^32-1后又从0开始，表示在这个报文段中的第一个数据字节的编号。利用序号段可以纠正传输导致的乱序，从而重组分段报文。<br>&nbsp;&nbsp; *确认序号：TCP使用32确认号标识下一个希望收到的报文的第一个字节的编号。因此，确认号应当是上一次成功接收到的数据字节序号加1。<br>&nbsp;&nbsp; *首部长度：4bit，该字段以字为单位计量TCP头长度。<br>&nbsp;&nbsp; *保留：6bit恒为0，将来定义新的用途。<br>&nbsp;&nbsp; *URG：紧急指针有效。<br>&nbsp;&nbsp; *ACK：确认序号有效。<br>&nbsp;&nbsp; *PSH：接收方应该尽快将这个报文交给应用层。<br>&nbsp;&nbsp; *RST：重置连接。<br>&nbsp;&nbsp; *SYN：同步序号，用来发起一个连接。<br>&nbsp;&nbsp; *FIN：发送端完成发送任务。<br>&nbsp;&nbsp; *窗口：该16bit字段表明接收端声明可以接收的TCP数据段大小，最大为65535字节。<br>&nbsp;&nbsp; *校验和：该16bit由发送端计算存储，由接收端进行验证。验证整个TCP，包括首部和数据。<br>&nbsp;&nbsp; *紧急指针：只有当URG置1时才有效。紧急指针是一个正的偏移量，和序号字段中的值相加表示紧急数据最后一个字节的序号。用于发送紧急数据、<br>&nbsp;&nbsp; *选项：常见可选字段是最长报文大小。<br>&nbsp;&nbsp; *数据：TCP数据部分是可选的。在建立和释放连接时，双方交换的只有TCP首部。</p>
<p>6。TCP建立连接的3次握手</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; (1)请求端（客户）发送一个SYN段，指明客户打算连接的服务器的端口以及SEQ（初始序号）。 <br>&nbsp;&nbsp; （2）服务器发回包含服务器的SEQ（初始序号）的SYN报文段作为应答。同时序号（ISN）加1，用以对客户的SYN报文段进行确认。<br>&nbsp;&nbsp;&nbsp; （3）客户将确认服务器的ISN加1，用以对服务器的SYN报文段进行确认。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/3png_2.png"><img style="border: 0px none; display: inline;" title="3png" alt="3png" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/3png_thumb.png" border="0" height="343" width="433"></a></p>
<p>&nbsp;</p>
<p>7。UDP<br><a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_6.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_thumb_2.png" border="0" height="93" width="583"></a>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UDP数据报首部</p>
<p>8。ARP/RARP</p>
<p>ARP(Address Resolution Protocol，地址解析协议) ARP中规定了两种信息的基本类型：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请求（Request）和应答（Response）。</p>
<p>&nbsp;<a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_12.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_thumb_5.png" border="0" height="128" width="555"></a>&nbsp; </p>
<p><a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_14.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_thumb_6.png" border="0" height="213" width="555"></a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp; *操作类型：该16bit字段用以区分协议的四种操作类型，即ARP请求（值为1），ARP应答（值为2）,<br>RARP请求（值为3），RARP请求（值为4）。</p>
<p>9。ICMP</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ICMP全称为Internet Control Protocol，即Internet控制报文协议。ICMP是IP的附属协议，IP用它来与其他主机或路由器交换错误报文和其他一些网络情况。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在ICMP包中携带了控制信息和故障恢复信息，这些信息有以下几个方面：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *源抑制：这是一个流控制信息，由接收方向源主机发送该消息来请求源主机停止发送数据。当接收主机在其缓冲区快满时发送该信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *路径重定向：由网关向请求其提供服务的主机发送，用于通知该主机在网络中还有其他距离目的主机更近的网关。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *主机不可达：在网络状况不佳的网络中传送数据报时，发生故障的网关或者系统会发送此信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *应答请求与回复：用Ping来检测目标是否可达。</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_16.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_thumb_7.png" border="0" height="276" width="460"></a> </p>
<p>&nbsp;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_18.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/Windows_9D57/image_thumb_8.png" border="0" height="666" width="579"></a> </p><img src ="http://www.cppblog.com/Geek/aggbug/118875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2010-06-28 18:23 <a href="http://www.cppblog.com/Geek/archive/2010/06/28/118875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络程序设计基础知识拾掇（一）</title><link>http://www.cppblog.com/Geek/archive/2010/06/17/118072.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Thu, 17 Jun 2010 05:19:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2010/06/17/118072.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/118072.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2010/06/17/118072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/118072.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/118072.html</trackback:ping><description><![CDATA[<p>1。网络应用程序的一般组成</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般来讲，可以将网络应用程序分为两个部分。一部分专门用来负责通信的模块；它们与网络协议栈相连接，借助网络协议栈提供的服务完成网络上的数据信息交换；另外一部分是面向用户或者进行其他处理的模块，它们接收用户的命令，或者对借助网络传输过来的数据进行加工。</p> <p>2。网络协议栈</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 规定计算机之间交换的消息格式和含义的协定，被称为网络协议或者计算机通信协议。按照分层的模型设计协议，所形成的协议软件也是按层组织的，使用“栈”这一术语来描述实现整套协议的软件。&nbsp; <br>Internet是基于TCP/IP协议栈的。</p> <p>3。网间进程通信</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网间进程通信是指网络中不同主机的应用进程之间相互通信，当然，也可以把同机进程通信看做是网间通信的特例。网间通信需要解决以下问题。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）网间进程标识问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在同一主机中，不同的进程可以用进程号唯一标识，但是，在网络环境下，各主机独立分配进程号已经不能惟一的标识。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Internet中，用一个三元组可以在全局惟一的标识一个应用进程。<br>&nbsp; 应用进程=（传输层协议，主机的IP地址，传输层端口）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个完整的网间通信定义一个五元组在全局惟一的标识。<br>（传输层协议，本地机IP得之，本地机传输层端口，远地机IP地址，远地机传输层端口）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）与网络协议栈连接的问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网间通信实际是借助网络协议栈实现的。对于网络编程来说，与网络协议连接，这个问题通过定义套接字网络编程接口来解决。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）多重协议问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现行的网络体系结构很多，操作系统往往支持众多的协议，不同的协议的工作方式不同，地址格式不同，因此网间进程通信需要解决多重协议的识别问题。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （4）不同的通信服务的问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网间通信所要求的通信服务有不同的要求。在TCP/IP协议栈中，传输层有TCP和UDP两个协议，TCP提供可靠的数据流来传输服务，UDP提供不可靠的数据报传输服务，需要根据通信服务要求做出选择。 </p> <p>4。TCP/IP简介</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; TCP/IP(Transmission Control/Inetnet Protocol，传输控制协议/网际协议)是一系列协议，或者说协议簇，它定义了数据传输如何通过因特网进行交换。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/ec9bce4b077b_1254E/TCP%20IP%20%E5%8D%8F%E8%AE%AE%E5%9B%BE_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="TCP IP 协议图" border="0" alt="TCP IP 协议图" src="http://www.cppblog.com/images/cppblog_com/Geek/WindowsLiveWriter/ec9bce4b077b_1254E/TCP%20IP%20%E5%8D%8F%E8%AE%AE%E5%9B%BE_thumb.jpg" width="372" height="334"></a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图。TCP/IP协议栈简图</p> <p>5。端口号的分配机制</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 具体来说，TCP或UDP端口分配规则如下。<br></p> <table border="0" cellspacing="0" cellpadding="2" width="400"> <tbody> <tr> <td valign="top" width="90">端口号</td> <td valign="top" width="310">用途</td></tr> <tr> <td valign="top" width="90">0</td> <td valign="top" width="310">不使用，或者作为特殊用途</td></tr> <tr> <td valign="top" width="90">1~255</td> <td valign="top" width="310">保留给特定服务</td></tr> <tr> <td valign="top" width="90">256~1023</td> <td valign="top" width="310">保留给其他的服务，如路由</td></tr> <tr> <td valign="top" width="90">1024~4999</td> <td valign="top" width="310">可以用作任意客户端口</td></tr> <tr> <td valign="top" width="90">5000~65535</td> <td valign="top" width="310">可以用作任意的服务器端口</td></tr></tbody></table><img src ="http://www.cppblog.com/Geek/aggbug/118072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2010-06-17 13:19 <a href="http://www.cppblog.com/Geek/archive/2010/06/17/118072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>