嵌入式linux的网络编程(1)--TCP/IP协议概述
嵌入式linux的网络编程(1)--TCP/IP协议概述
1.OSI参考模型及TCP/IP参考模型
通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著名的OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,从上到下共分为7 层:应用层,表示层,会话层,传输层,网络层,数据链路层及物理层.这个7 层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂.但它仍是此后很多协议模型的基础,这种分层架构的思想在很多领域都得到了广泛的应用.
与此相区别的TCP/IP协议模型从一开始就遵循简单明确的设计思路,它将TCP/IP 的7层协议模型简化为4层,从而更有利于实现和使用.TCP/IP协议许多年来一直被人们所采用,而且越来越多成熟,大多数类型的计算机环境都有TCP/IP产品,它提供了文件传输,电子邮件,终端仿真,传输服务和网络管理等功能.TCP/IP的协议参考模型和OSI协议参考
模型的对应关系如下图所示.
下面分别对者TCP/IP的4层模型进行简要介绍.
- 网络接口层:负责将二进制流转换为数据帧,并进行数据帧的发送和接收.数据帧是网络信息传输的基本单元.
- 网络层:负责将数据帧封装成IP数据报,同时负责选择数据包的路径,也就是路由.
- 传输层:负责端对端之间的通信会话连接与建立.传输协议的选择根据数据传输方式而定.
- 应用层:负责应用程序的网络访问,这里通过端口号来识别各个不同的进程.
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协议概述的更多相关文章
- linux高性能服务器编程 (一) --Tcp/Ip协议族
前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...
- java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求
1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...
- 【转载】[基础知识]【网络编程】TCP/IP
转自http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=27043 [基础知识][网络编程]TCP/IP iooops 胖友们楼主我又 ...
- linux视频学习3(linux安装,shell,tcp/ip协议,网络配置)
linux系统的安装: 1.linux系统的安装方式三种: 1.独立安装linux系统. 2.虚拟机安装linux系统. a.安装虚拟机,基本是一路点下去. b.安装linux. c.linux 安装 ...
- 2015-07学习总结——网络编程(TCP/IP)
之前学习的主要内容是单机上的处理,比如编程语言.游戏编程.数据库.多媒体编解码.其实对网络也有些接触,比如WWW.HTTP.UDP/TCP.RTP.RTMP.SNMP.FTP.单播组播.Telnet. ...
- android 网络编程--socket tcp/ip udp http之间的关系
网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络 ...
- python网络编程(TCP/IP、发邮件)
TCP/IP 关注公众号"轻松学编程"了解更多. 计算机为了联网,就必须规定通讯协议,早期的计算机网络是由各个厂商规定的一些协议,他们之间互不兼容. 为了把全世界的电脑能够连接到一 ...
- 【Linux网络基础】TCP/IP 协议簇(各个常见协议介绍)
一.应用层协议 1. FTP 协议所在层次:应用层协议 名称:FTP协议 协议端口:20,21 协议说明: FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组 ...
- 【Linux网络基础】TCP/IP协议簇的详细介绍(三次握手四次断开,11种状态)
一.TCP/IP协议簇(DoD参考模型) 用于简化OSI层次,以及相关的标准. 传输控制协议(tcp/ip)簇是相关国防部DoD所创建的,主要用来确保数据的完整性以及在毁灭性战争中维持通信 是由一组不 ...
随机推荐
- python之lambda表达式
lambda函数小结 1.lambda表达式: 以前看人家写一个长式子就能干一件我写一个函数干的事情觉得好帅,现在通过学习知道了lambda表达式其原理就是一个函数,而且是一个只能处理简单功能的函数. ...
- City Game(动态规划)
City Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- AJAX - 创建 XMLHttpRequest 对象
XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject ...
- MVC多表联合查询数据显示
随然做过几年.net开发,但一直没有做过MVC框架下的网站,这段时间无事,学习一下.下面的方法是我摸索过程中的一点总结,如果有更好的方法,欢迎告诉我,谢谢. 这段时间我只看了MVC和LinQ两本书,关 ...
- 获取第上一个兄弟元素 屏蔽浏览器的差异(PreviousElementSibling)
//获取element上一个兄弟元素 function getPreviousElementSibling(element){ //能力检测 判断是否支持PreviousElementSibling ...
- JavaScript之childNodes属性、nodeType属性学习
1.childNodes属性:在一颗节点树上,childNodes属性可以用来获取任何一个元素的所有元素,它是一个包含这个元素所有子元素的数组. <body> <script typ ...
- param
页面之间值传递用param作为参数,提高网站安全性
- ##DAY11 UITableView编辑
##DAY11 UITableView编辑 每一个视图控制器都有一个编辑按钮,因为项目中编辑的应用场景非常多,所以系统预留了一个编辑按钮供我们使用 self.navigationItem.leftBa ...
- Ext Store Proxy Ajax
使用Store ajax的方式来获取数据 <div id="grid1"> </div> <script> Ext.onReady(functi ...
- linux下查找文件、排序、查看文件内容
本文介绍下,在linux系统中,查找文件的命令用法,以及按时间排序找到的目标文件的方法. 1.例如:查找当前目录下所有.ini文件,并按时间排序 示例: find ./ -name *.ini ...