您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 电气安装工程 > linux网络基础知识
Linux网络基础知识TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。网络接口层(网络接口层例如以太网设备驱动程序):对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、SerialLine等)来传送数据。网络接口层在发送端将上层的IP数据报封装成帧后发送到网络上;数据帧通过网络到达接收端时,该结点的网络接口层对数据帧拆封,并检查帧中包含的MAC地址。如果该地址就是本机的MAC地址或者是广播地址,则上传到网络层,否则丢弃该帧。网络接口层可细分为数据链路层和物理层,数据链路层实际上就是网卡的驱动程序,物理层实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西。链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。网卡驱动程序主要实现发送数据帧与接受数据帧的功能,发送数据帧采用内核函数hard_start_xmit();接收数据帧采用内核函数netif_rx();网卡驱动程序主要是分配设置及注册net_dev结构体;数据帧的载体采用sk-buff结构体。用浏览网页为例:发送方:1.输入网址:,按了回车键,电脑使用应用层用IE浏览器将数据从80端口发出,给了下一层协议——传输层。2.传输层将数据前面加上了TCP标记,标记这是80端口发出的哦,将这个数据段给了下一层——网络层。3.网络层在使这个数据段前面加上了自己机器的IP和目的IP,这时这个段被称为IP数据包(也可以称为报文),然后将这个IP数据包给了下一层协议——网络接口层。4.网络接口层,网络接口层先将IP数据包前面加上自己机器的MAC地址,以及目的MAC地址,这时加上MAC地址的数据称为帧,网络接口层最后用对应的物理设备——网卡,将这个帧以比特流的方式发送到网络上。互联网上有路由器,它会读取比特流中的IP地址进行选路,到达正确的网段,之后这个网段的交换机读取比特流中的MAC地址,找到对应要接收的机器。接收方:1.网络接口层用网卡接收到了比特流,读取比特流中的帧,将帧中的MAC地址去掉,就成了IP数据包,传递给了上一层网络层。2.网络层接收了下层传上来的IP数据包,将IP从包的前面拿掉,取出带有TCP的数据(数据段)交给了传输层。3.传输层拿到了这个数据段,看到TCP标记的是80端口发送的嘛,那就是HTTP协议咯,之后将TCP头去掉并将数据交给应用层,告诉应用层对方要求的是HTTP的数据。4.应用层知道了这个是发送方以端口80发送过来的数据,知道TCP端口80是HTTP协议,要用IE来回复,所以将的网址按照发送方的方式发送回去。组播协议中没有提供用户认证的支持,用户可以随意加入一个组播组,并可以任意地离开。组播源无法知道用户何时加入、何时退出,无法统计出某个时间网络上共有多少个用户在接收组播数据。组播源也缺少有效的手段控制组播信息在网络上的传送方向和范围。组播技术的优势:(1)带宽资源的有效利用以及CPU资源的有效利用;(2)减少数据的冗余;(3)数据传输的实时性好。组播技术的劣势:(1)IP组播的安全性网络数据包封包与拆包过程:TCP层包头:IP层包头:DATA应用层包头传输层包头IP层包头链路层包头DATA应用层包头传输层包头DATA应用层包头IP层包头传输层包头DATA应用层包头应用层传输层IP层链路层包尾DATA应用层包头传输层包头IP层包头链路层包头DATA应用层包头传输层包头DATA应用层包头IP层包头传输层包头DATA应用层包头包尾主机A:应用程序1主机B:应用程序2链路层包头:netif_start_queue(structnet_device*dev)该函数用于告诉上层网络驱动层驱动空间有缓冲区可用,开始发送数据包到驱动层;netif_wake_queue(structnet_device*dev)和netif_stop_queue(dev)是数据发送流程中要调用的两个非常重要的函数,分别用于唤醒和阻止上层向下传送数据包。网络设备接收数据的主要方法是由中断引发设备的中断处理函数,中断处理函数判断中断类型,如果为接收中断,则读取接收到的数据,分配sk_buff数据结构和数据缓冲区,将接收到的数据复制到数据缓冲区,并调用netif_rx()函数将sk_buff传递给上层协议。Linux网络设备驱动程序的体系结从上到下可以划分为4层,依次为网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层以及网络设备与媒介层,这4层的作用如下所示:(1)网络协议接口层向网络层协议提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过netif_rx()函数接收数据。这一层的存在使得上层协议独立于具体的设备。(2)网络设备接口层向协议接口层提供统一的用于描述具体网络设备属性和操作的结构体net_device,该结构体是设备驱动功能层中各函数的容器。实际上,网络设备接口层从宏观上规划了具体操作硬件的设备驱动功能层的结构。(3)设备驱动功能层各函数是网络设备接口层net_device数据结构的具体成员,是驱使网络设备硬件完成相应动作的程序,它通过hard_start_xmit()函数启动发送操作,并通过网络设备上的中断触发接收操作。(4)网络设备与媒介层是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介,网络适配器被设备驱动功能层中的函数物理上驱动。对于Linux系统而言,网络设备和媒介都可以是虚拟的。Linux网络设备驱动体系结构的层次化设计实现了对上层协议接口的统一和硬件驱动的对下层多样化硬件设备的可适应。程序员需要完成的工作集中在设备驱动功能层,网络设备接口层net_device结构体的存在将千变万化的网络设备得以抽象,使得设备功能层中除数据包接收以外的主体工作都由填充net_device的属性和函数指针完成。在Linux网络子系统和设备驱动中,套接字缓冲区sk_buff发挥着巨大的作用,是所有数数据(46~1500字节)6目的地址6源地址2类型EthernetMAC4CRC据流动的载体。网络设备驱动和上层协议之间也依赖此结构进行数据包交互,因此,我们要特别牢记它的操作方法。Socket编程中bind()函数对于server端,绑定意味着该服务器只能接收来自被绑定的协议端口(IP地址和TCP端口号)的数据。而对于client端,意味着该客户端向服务器所绑定的协议端口号发送数据。通常client端并不需要绑定操作,交由系统内核决定选择一个端口号发送。htons()函数的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。TCP编程的服务器端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();*可选3、绑定IP地址、端口等信息到socket上,用函数bind();4、开启监听,用函数listen();5、接收客户端上来的连接,用函数accept();6、收发数据,用函数send()和recv(),者read()和write();7、关闭网络连接;8、关闭监听。TCP编程的客户端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();*可选3、绑定IP地址、端口等信息到socket上,用函数bind();*可选4、设置要连接的对方的IP地址和端口等属性;5、连接服务器,用函数connect();6、收发数据,用函数send()和recv(),或者read()和write();7、关闭网络连接。UDP编程的服务器端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();*可选3、绑定IP地址、端口等信息到socket上,用函数bind();4、循环接收数据,用函数recvfrom();5、关闭网络连接。UDP编程的客户端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();*可选3、绑定IP地址、端口等信息到socket上,用函数bind();*可选4、设置对方的IP地址和端口等属性;5、发送数据,用函数sendto();6、关闭网络连接。在TCP和UDP同属于传输层,共同架设在IP层(网络层)之上。而IP层主要负责的是在节点之间(EndtoEnd)的数据包传送,这里的节点是一台网络设备,比如计算机。因为IP层只负责把数据送到节点,而不能区分上面的不同应用,所以TCP和UDP协议在其基础上加入了端口的信息,端口于是标识的是一个节点上的一个应用。除了增加端口信息,UPD协议基本就没有对IP层的数据进行任何的处理了。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(SliceWindow),以及接收确认和重发机制,以达到数据的可靠传送。不管应用层看到的是怎样一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,需要由TCP协议来进行数据重组。Linux专门提供了字节转换函数.unsignedlonginthtonl(unsignedlonginthostlong)unsignedshortinthtons(unsignedshortinthostshort)unsignedlongintntohl(unsignedlongintnetlong)unsignedshortintntohs(unsignedshortintnetshort)在这四个转换函数中,h代表host,n代表network,s代表short,l代表long。htonl()函数的意义是将本机器上的long数据转化为网络上的long。其他几个函数的意义也差不多。TCP连接是双向的(是可读写的),当我们使用close时,会把读写通道都关闭,有时侯我们希望只关闭一个方向,这个时候我们可以使用shutdown.针对不同的howto,系统回采取不同的关闭方式.intshutdown(intsockfd,inthowto)howto=0这个时候系统会关闭读通道.但是可以继续往接字描述符写;howto=1关闭写通道,和上面相反,着时候就只可以读了;howto=2关闭读写通道,和close一样。TCP连接的建立TCP协议是一种可靠的连接,为了保证连接的可靠性,TCP的连接要分为几个步骤.我们把这个连接过程称为三次握手.第一步客户机向服务器发送一个TCP数据包,表示请求建立连接.为此,客户端将数据包的SYN位设置为1,并且设置序列号seq=1000(我们假设为1000);第二步服务器收到了数据包,并从SYN位为1知道这是一个建立请求的连接.于是服务器也向客户端发送一个TCP数据包.因为是响应客户机的请求,于是服务器设置ACK为1,sak_seq=1001(1000+1)同时设置自己的序列号.seq=2000(我们假设为2000);第三步客户机收到了服务器的TCP,并从ACK为1和ack_seq=1001知道是从服务器来的确认信息.于是客户机也向服务器发送确认信息.客户机设置ACK=1,和ack_seq=2001,seq=1001,发送给服务器.至此客户端完成连接;最后一步服务器受
本文标题:linux网络基础知识
链接地址:https://www.777doc.com/doc-2881091 .html