嵌入式linux的网络编程(1)--TCP/IP协议概述

嵌入式linux的网络编程(1)--TCP/IP协议概述

CSDN2013年度博客之星评选活动开始,本人有幸入围参加评选,如果博客中的文章对你有所帮助,请为 ce123 投上宝贵一票,非常感谢!
投票地址:http://vote.blog.csdn.net/blogstaritem/blogstar2013/ce123

1.OSI参考模型及TCP/IP参考模型

通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著名的OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,从上到下共分为7 层:应用层,表示层,会话层,传输层,网络层,数据链路层及物理层.这个7 层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂.但它仍是此后很多协议模型的基础,这种分层架构的思想在很多领域都得到了广泛的应用.
与此相区别的TCP/IP协议模型从一开始就遵循简单明确的设计思路,它将TCP/IP 的7层协议模型简化为4层,从而更有利于实现和使用.TCP/IP协议许多年来一直被人们所采用,而且越来越多成熟,大多数类型的计算机环境都有TCP/IP产品,它提供了文件传输,电子邮件,终端仿真,传输服务和网络管理等功能.TCP/IP的协议参考模型和OSI协议参考
模型的对应关系如下图所示.

下面分别对者TCP/IP的4层模型进行简要介绍.

  1. 网络接口层:负责将二进制流转换为数据帧,并进行数据帧的发送和接收.数据帧是网络信息传输的基本单元.
  2. 网络层:负责将数据帧封装成IP数据报,同时负责选择数据包的路径,也就是路由.
  3. 传输层:负责端对端之间的通信会话连接与建立.传输协议的选择根据数据传输方式而定.
  4. 应用层:负责应用程序的网络访问,这里通过端口号来识别各个不同的进程.

2.TCP/IP协议族

TCP/IP协议实际上是一个庞大的协议族,它包括了各个层次上的众多协议,为网际数据通信提供不同层次的通路,下图列举了各层中一些重要的协议,并给出了各个协议在不同层次中所处的位置如下.



  • ARP:用于获得同一物理网络中的硬件主机地址.
  • MPLS:多协议标签协议,是很有发展前景的下一代网络协议.
  • IP:负责在主机和网络之间寻址和路由数据包.
  • ICMP:用于发送报告有关数据包的传送错误的协议.
  • IGMP:被IP主机用来向本地多路广播路由器报告主机组成员的协议.
  • TCP:为应用程序提供可靠的通信连接.适合于一次传输大批数据的情况.并适用于要求得到响应的应用程序.
  • UDP:提供了无连接通信,且不对传送包进行可靠的保证.适合于一次传输少量数据,可靠性则由应用层来负责.

3.TCP协议

3.1.简介

同其他任何协议栈一样,TCP向相邻的高层提供服务.因为TCP的上一层就是应用层,因此,TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递.应用程序通过编程调用TCP并使用TCP服务,提供需要准备发送的数据,用来区分接收数据应用的目的地址和端口号.
通常应用程序通过打开一个socket来使用TCP服务,TCP管理到其他socket的数据传递.可以说,通过IP的源/目的可以惟一地区分网络中两个设备的关联,通过socket的源/目的可以惟一地区分网络中两个应用程序的关联.

3.2.TCP连接建立的过程

TCP连接通过三次握手来初始化的.三次握手的目的是使数据段的发送和接收同步,告诉其他主机其一次可接收的数据量,并建立虚连接.
下面描述了这三次握手的简单过程。
初始化主机通过一个同步标志置位SYN的数据段发出会话请求.
接收主机通过发回具有以下项目的数据段表示回复:同步标志置位SYN,即将发送的数据段的起始字节的顺序号,应答并带有将收到的下一个数据段的字节顺序号.
请求主机再回送一个数据段,并带有确认顺序号和确认号.
下图就是这个流程的简单示意图

TCP实体所采用的基本协议是滑动窗口协议.当发送方传送一个数据报时,它将启动计时器.当该数据报到达目的地后,接收方的TCP实体向回发送一个数据报,其中包含有一个确认序号,它意思是希望收到的下一个数据报的顺序号.如果发送方的定时器在确认信息到达之前超时,那么发送方会重发该数据报.

3.3.TCP连接的标识

TCP是实现两主机间进程通信,所有只有两个主机的IP地址是不能标识一条连接的,在TCP中,使用两个socket来标识一条连接.socket由本地的IP地址和进程使用的端口号组成,<本地IP地址,本地端口>.这样对于一条TCP连接,就可以使用两个二元组来表示为<本地IP地址,本地端口>,<远端IP地址,远端端口>或者一个四元组表示为<本地IP地址,本地端口,本地IP地址,本地端口>.

3.4.TCP连接的关闭

关闭一条TCP连接有三种可能的情况.
1.发起连接的一方(主机A)请求关闭TCP连接.在这种情况下,主机A发送的数据包中,将包含一个FIN(FINSH,中止信息)控制信息,然后主机A将进入FIN-WAIT等待状态中.在这种状态下,主机A仍然可以接受数据,但不能发送数据了.当连接的另一端(主机B)收到这个数据包后,将发送一个确认数据包,但可能不包括FIN控制信息,直到主机B完成任务,才发送FIN.然后A端向B端发送FIN确认信息,这时B端变为CLOSED状态,A端延时一段时间后也转换为CLOSED状态.
2.主机B主动请求关闭TCP连接.主机A从网络中收到来自主机B的FIN控制信息,主机A将通知上层应用连接即将断开,而后当来自B端的数据发送完毕后,向B端发送FIN控制信息,确认后即断开.如果主机B上层应用的超时定时器超时后,还没有收到主机A的确认信息,则将主动断开TCP连接.
3.主机A和主机B同时发起断开连接的请求,其过程与上述两种情况大致相同,就不再详细介绍了.

3.5.TCP数据报头

下图给出了TCP数据报头的格式.

TCP数据报头的含义如下所示:
源端口,目的端口:16 位长.标识出远端和本地的端口号.
源端口,目的端口:16 位长.标识出远端和本地的端口号.
序号:32 位长.标识发送的数据报的顺序.
确认号:32位长.希望收到的下一个数据报的序列号.
TCP头长:4 位长.表明TCP头中包含多少个32位字.
6位未用.
ACK:ACK位置1表明确认号是合法的.如果ACK为0,那么数据报不包含确认信息,确认字段被省略.
PSH:表示是带有PUSH 标志的数据.接收方因此请求数据报一到便可送往应用程序而不必等到缓冲区装满时才传送.
RST:用于复位由于主机崩溃或其他原因而出现的错误的连接.还可以用于拒绝非法的数据报或拒绝连接请求.
SYN:用于建立连接.
FIN:用于释放连接.
窗口大小:16 位长.窗口大小字段表示在确认了字节之后还可以发送多少个字节.
校验和:16 位长.是为了确保高可靠性而设置的.它校验头部,数据和伪TCP头部之和.
可选项:0个或多个32位字.包括最大TCP 载荷,窗口比例,选择重发数据报等选项.

4.UDP协议

UDP即用户数据报协议,它是一种无连接协议,因此不需要像TCP那样通过三次握手来建立一个连接.同时,一个UDP应用可同时作为应用的客户或服务器方.由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多.
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是在网络质量越来越高的今天,UDP的应用得到了大大的增强.它比TCP 协议更为高效,也能更好地解决实时性的问题.如今,包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都使用UDP协议.

UDP数据包头如下图所示.


源地址,目的地址:16 位长.标识出远端和本地的端口号.

数据报的长度是指包括报头和数据部分在内的总的字节数,因为报头的长度是固定的,所以该域主要用来计算可变长度的数据部分(又称为数据负载).

校验和:16 位长.将首部和数据部分一起检验.

5.协议的选择

协议的选择应该考虑到以下3个方面.
(1)对数据可靠性的要求
对数据要求高可靠性的应用需选择TCP协议,如验证,密码字段的传送都是不允许出错的,而对数据的可靠性要求不那么高的应用可选择UDP传送。
(2)应用的实时性
由于TCP 协议在传送过程中要进行三次握手,重传确认等手段来保证数据传输的可靠性.使用TCP 协议会有较大的时延,因此不适合对实时性要求较高的应用,如VOIP,视频监控等.相反,UDP协议则在这些应用中能发挥很好的作用.
(3)网络的可靠性
由于TCP协议的提出主要是解决网络的可靠性问题,它通过各种机制来减少错误发生的概率.因此,在网络状况不是很好的情况下需选用TCP 协议(如在广域网等情况),但是若在网络状况很好的情况下(如局域网等)就不需要再采用TCP 协议,选择UDP协议来减少网络负荷.

6.socket概述

在Linux中的网络编程是通过socket接口来进行的.人们常说的socket接口是一种特殊的I/O,它也是一种文件描述符.每一个socket都用一个半相关描述{协议,本地地址,本地端口}来表示;一个完整的套接字则用一个相关描述{协议,本地地址,本地端口,远程地址,远程端口}.socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立,数据传输等操作都是通过socket来实现的.
常见的 socket有3 种类型如下。
(1)流式socket(SOCK_STREAM).流式套接字提供可靠的,面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性.
(2)数据报socket(SOCK_DGRAM).数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠,无差错的.它使用数据报协议UDP.
(3)原始socket.原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发.

你可能感兴趣的:(嵌入式linux的网络编程(1)--TCP/IP协议概述)