文章转自:http://blog.csdn.net/jmq_0000/article/details/7091142
什么是linux网络编程
网络编程即编写通过计算机网络与其它程序进行通信的这类程序。网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的---客户端和服务器端。网络程序是先有服务器程序启动,等待客户端的程序运行并建立连接.一般的来说是服务端的程序在一个端口上监听,直到有一个客户端的程序发来了请求。网络通信需要网络通信协议持。Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用, 会返回一个用于通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,这就是linux的设备无关性的好处.我们可以通过向描述符读写操作实现网络之间的数据交流。
什么是tcp/ip协议
TCP/IP 是供已连接因特网的计算机进行通信的通信协议。TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。 这4层分别为:
应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传灯。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层(主机-网络层):接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
在 TCP/IP 中包含一系列用于处理数据通信的协议:
- TCP (传输控制协议) - 应用程序之间通信
- UDP (用户数据包协议) - 应用程序之间的简单通信
- IP (网际协议) - 计算机之间的通信
- ICMP (因特网消息控制协议) - 针对错误和状态
- DHCP (动态主机配置协议) - 针对动态寻址
协议采用分层结构,因此,数据报文也采用分层封装的方法。下面以应用最广泛的以太网为例说明其数据报文分层封装,如下所示:
┏━━━━━━━━━━┓
┃TCP报头 │ TCP数据区┃TCP
┗━━━━━━━━━━┛
┏━━━━━━━━━━━━━━━┓
┃ IP报头┃.........IP数据区.............┃IP
┗━━━━━━━━━━━━━━━┛
┏━━━━━━━━━━━━━━━━━━━┓┃ 帧头┃................帧数据区......................┃ETH
┗━━━━━━━━━━━━━━━━━━━┛
任何通讯协议都有独特的报文格式,TCP/IP协议也不例外。对于通讯协议编程,我们首先要清楚其报文格式。由于TCP/IP协议采用分层模型,各层都有专用的报头,以下就简单介绍以太网下TCP/IP各层报文格式。
什么是TCP协议
TCP是TCP/IP的传输层协议。TCP向应用层提供了一种可靠的面向连接的数据流传输服务。TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据; TCP提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。TCP通过三次握手来初始化的。
TCP报文格式如下:
0 7 8 15 16 23 24 31
┣┳┳┳┳┳┳┳╋┳┳┳┳┳┳┳╋┳┳┳┳┳┳╋┳┳┳┳┳┳┳┫
┃ 源端口 ┃ 目的端口 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 顺 序 号 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 确 认 号 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃头长度┃ U A P R S F│ 窗口大小 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 校 验 和 ┃ 紧 急 指 针 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 可选项(0或多个32bit) ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 数 据 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
1.源端口、目的端口:16bit,标识出远端和本地的端口号。
2.顺序号:32bit,标识发送的数据包顺序。
3.确认号:32bit,希望收到的下一个数据包的序列号。
4.TCP头长:4bit,表明TCP头包含多少个32bit。
5.6bit保留未用。
6.URG:紧急指针,表明发送端向另一端使用紧急方式发送数据。(6-11都只占1bit)
7.ACK:ACK位置1表明确认号合法的;如果ACK为0,那么数据包不包含确认信息,确认字段被省略。
8.PSH:表示带有PUSH标志的数据。因此请求数据包一到接收可送往应用程序而不必等到缓冲区装满时才传送。
9.RST:用于复位由于主机崩溃或其它原因而出现的错误连接,还可以用于拒绝非法的数据包或拒绝请求。
10.SYN:用于建立连接用。
11.FIN:用于释放连接。
12.窗口大小:16bit,窗口大小字段表示在确认了字节之后还可以发多少字节。
13.校验和:16bit,是为了确保高可靠性而设计的。
14.可选项:0或多个32bit,包括最大TCP载荷、窗口比例、选择重发数据包等选项。
什么是UDP协议
UDP是一个简单的面向数据报的运输层协议,是一种面向无连接的不可靠传输协议,不需要通过3次握手来建立连接。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP报文格式如下:
0 7 8 15 16 23 24 31
┣┳┳┳┳┳┳┳╋┳┳┳┳┳┳┳╋┳┳┳┳┳┳╋┳┳┳┳┳┳┳┫
┃ 源端口 ┃ 目的端口 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ UDP长度 ┃ UDP校验和 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ ┃
┃ 数 据 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
什么是IP协议
IP协议位于网络层,它提供了不可靠的、无连接的数据报传输机制。TCP/IP是为了适应物理网络的多样性而设计的,而这种适应性主要是通过IP层来体现的。由于物理网络的多样性,各种物理网络的数据帧格式、地址格式之间的差异很大。为了将这些底层的细节屏蔽起来,使得采用不同物理网络的网络之间进行通讯, TCP/IP分别采用了IP数据报和IP地址作为物理数据帧与物理地址的统一描述形式。这样IP向上层提供统一的IP数据报和统一的IP地址,使得各种物理帧及物理地址的差异性对上层协议不复存在。
IP数据报头格式如下:
0 7 8 15 16 23 24 31
┣┳┳┳┳┳┳┳╋┳┳┳┳┳┳┳╋┳┳┳┳┳┳╋┳┳┳┳┳┳┳┫
┃ VERS │HLEN │ 服务类型 ┃ 总长度 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 标 识 ┃ 标记 │ 分段偏移 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 生 存 期 ┃ 协 议 ┃ 头校验和 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 源 IP 地 址 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ 目 的 IP 地 址 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ IP选项(可选) ┃ 填充 ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
┃ IP报文数据(最大65535字节) ┃
┣┼┼┼┼┼┼┼╋┼┼┼┼┼┼┼╋┼┼┼┼┼┼╋┼┼┼┼┼┼┼┫
(1) 版本字段(VERS):记录数据报文符合协议的哪一个版本协议。版本号表示发送者、接收者和路由器对该数据的处理都要按所示的版本进行。现在的版本号是4。
(2) 首部长度(HLEN):指明报头的长度。
(3) 服务类型:一共8个比特,前3个比特表示优先级,第4个比特表示要求有更低的时延,第5个比特表示要求有更高的吞吐量,第6个比特表示要求更高的可靠性,第7个比特表示选择价格更低廉的路由,最后一个比特未用。
(4) 总长度包括报头长度和数据长度,最大长度 = 65536字节。
(5) 标识符:用于数据分段,一个数据报在传输过程中可能分成若干段,标识符可以区分某分段属于某报文,一个数据报的所有分段具有相同的标识符。
(6) DF:该位置1时表示不分段,置0时允许分段。
(7) MF:表示后面还有一分段,除了最后一个分段,所有分段的MF置为1。
(8) 段偏移:指明此分段在当前数据报中的位置。
(9) 生存周期:限定分段生存期的计数器,当它为0时该分段被抛弃,时间单位为秒。
(10) 协议:指明此数据报属于哪一种传送过程,如TCP、UDP等。
(11) 报头校验和:只校验报头。
(12) 源端地址和目的端地址:指明源和目的方的网络编号与主机号,即IP地址。
(13) 可选字段:用于协商设定服务参数。
什么是Socket
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据 报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。