㈠ win10怎么查看应用程序的网络数据使用量
您指的是即使的网络设备占用还是流量的统计?
即时的可以在任务管理器里查看单个进程的
总计可以在 设置(可在操作中心里找到)>网络和Internet>数据使用量>使用量详细信息 里查看
㈡ 网络通信
我们要理解网络中进程如何通信,得解决两个问题:
a、我们要如何标识一台主机,即怎样确定我们将要通信的进程是在那一台主机上运行。
b、我们要如何标识唯一进程,本地通过pid标识,网络中应该怎样标识?
解决办法:
a、TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机
b、传输层的“协议+端口”可以唯一标识主机中的应用程序(进程),因此,我们利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互
以UDP传输为例:
1、物理层:
解决两个硬件之间怎么通信的问题,常见的物理媒介有光纤、电缆、中继器等。它主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
2、数据链路层:
在计算机网络中由于各种干扰的存在,物理链路是不可靠的。该层的主要功能就是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
它的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层的数据叫做帧。
3、网络层:
计算机网络中如果有多台计算机,怎么找到要发的那台?如果中间有多个节点,怎么选择路径?这就是路由要做的事。
该层的主要任务就是:通过路由选择算法,为报文(该层的数据单位,由上一层数据打包而来)通过通信子网选择最适当的路径。这一层定义的是IP地址,通过IP地址寻址,所以产生了IP协议。
4、传输层:
当发送大量数据时,很可能会出现丢包的情况,另一台电脑要告诉是否完整接收到全部的包。如果缺了,就告诉丢了哪些包,然后再发一次,直至全部接收为止。
简单来说,传输层的主要功能就是:监控数据传输服务的质量,保证报文的正确传输。
5、会话层:
虽然已经可以实现给正确的计算机,发送正确的封装过后的信息了。但我们总不可能每次都要调用传输层协议去打包,然后再调用IP协议去找路由,所以我们要建立一个自动收发包,自动寻址的功能。于是会话层出现了:它的作用就是建立和管理应用程序之间的通信。
6、表示层:
表示层负责数据格式的转换,将应用处理的信息转换为适合网络传输的格式,或者将来自下一层的数据转换为上层能处理的格式。
7、应用层:
应用层是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。前端同学对应用层肯定是最熟悉的。
应用层(应用,表示,会话):TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
重要的 协议族介绍:
IP 定义了 TCP/IP 的地址,寻址方法,以及路由规则。现在广泛使用的 IP 协议有 IPv4 和 IPv6 两种:IPv4 使用 32 位二进制整数做地址,一般使用点分十进制方式表示,比如 192.168.0.1。
IP 地址由两部分组成,即网络号和主机号。故一个完整的 IPv4 地址往往表示 为 192.168.0.1/24 或192.168.0.1/255.255.255.0 这种形式。
IPv6 是为了解决 IPv4 地址耗尽和其它一些问题而研发的最新版本的 IP。使用 128 位 整数表示地址,通常使用冒号分隔的十六进制来表示,并且可以省略其中一串连续的 0,如:fe80::200:1ff:fe00:1。
目前使用并不多!
http协议对应于应用层,tcp协议对应于传输层,ip协议对应于网络层。
TPC/IP【TCP(传输控制协议)和IP(网际协议)】,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
术语TCP/IP代表传输控制协议/网际协议,指的是一系列协议。“IP”代表网际协议,TCP和UDP使用该协议从一个网络传送数据包到另一个网络。把IP想象成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。
你应该能理解,TCP和UDP是FTP,HTTP和SMTP之类使用的传输层协议。虽然TCP和UDP都是用来传输其他协议的,它们却有一个显着的不同:TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。
URL的全称是Uniform Resource Locator(统一资源定位符)
通过1个URL,能找到互联网上唯一的1个资源。
URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL。
URL的基本格式 =协议://主机地址/路径
协议:不同的协议,代表着不同的资源查找方式、资源传输方式
主机地址:存放资源的主机(服务器)的IP地址(域名)
资源在主机(服务器)中的具体位置
1、HTTP协议的几个重要概念
1.连接(Connection):一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。
2.消息(Message):HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
3.请求(Request):一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
4.响应(Response):一个从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如“成功”或“没找到”)和文档的MIME类型。
5.资源(Resource):由URI标识的网络数据对象或服务。
6.实体(Entity):数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。
7.客户机(Client):一个为发送请求目的而建立连接的应用程序。
8.用户代理(Useragent):初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。
9.服务器(Server):一个接受连接并对请求返回信息的应用程序。
10.源服务器(Originserver):是一个给定资源可以在其上驻留或被创建的服务器。
11.代理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。
代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
12.网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
13.通道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。
14.缓存(Cache):反应信息的局域存储。
TCP(Transmission Control Protocol) 传输控制协议。TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握确认建立一个连接。位码即tcp标志位,有6种 标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)。
手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。建立起一个TCP连接需要经过“三次握手”:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。握手完成后,两台主机开始传输数据了。
为什么要三次握手?
如果只有一次握手,Client不能确定与Server的单向连接,更加不能确定Server与Client的单向连接;
如果只有两次握手,Client确定与Server的单向连接,但是Server不能确定与Client的单向连接;
只有三次握手,Client与Server才能相互确认双向连接,实现双工数据传输。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次挥手”。
第一次挥手:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:
Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:
Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
为什么要四次挥手?
“三次握手”的第二次握手发送SYN+ACK回应第一次握手的SYN,但是“四次挥手”的第二次挥手只能发送ACK回应第一次挥手的FIN,因为此时Server可能还有数据传输给Client,所以Server传输数据完成后才能发起第三次挥手发送FIN给Client,等待Client的第四次挥手ACK。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。HTTPS其实是有两部分组成:HTTP +SSL/ TLS,也就是在HTTP上又加了一层处理加密信息的模块。采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。
1.怎么解决tcp拆包和黏包的问题
粘包、拆包发生原因
发生TCP粘包或拆包有很多原因,现列出常见的几点,可能不全面,欢迎补充,
1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
等等。
粘包、拆包解决办法
解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有如下几个:
1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。
等等。
2.upd丢包
1、接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。
2、发送的包巨大丢包:虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。
3、发送的包较大,超过接受者缓存导致丢包:包超过mtu size数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
4、发送的包频率太快:虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。这种情况也有时可以通过设置socket接收缓冲解决,但有时解决不了。所以在发送频率过快的时候还是考虑sleep一下吧。
5、局域网内不丢包,公网上丢包。这个问题我也是通过切割小包并sleep发送解决的。如果流量太大,这个办法也不灵了。总之udp丢包总是会有的,如果出现了用我的方法解决不了,还有这个几个方法: 要么减小流量,要么换tcp协议传输,要么做丢包重传的工作。
一个是客户端发送过快,网络状况不好或者超过服务器接收速度,就会丢包。
第二个原因是服务器收到包后,还要进行一些处理,而这段时间客户端发送的包没有去收,造成丢包。
那么需要做的是
客户端降低发送速度,可以等待回包,或者加一些延迟。服务器部分单独开一个线程,去接收UDP数据,存放在一个缓冲区中,又另外的线程去处理收到的数据,尽量减少因为处理数据延时造成的丢包。
有两种方法解决UDP 丢包的问题:
方法一:重新设计一下协议,增加接收确认超时重发。(推荐)
方法二:在接收方,将通信和处理分开,增加个应用缓冲区;如果有需要增加接收socket的系统缓冲区。(本方法不能从根本解决问题,只能改善)
https://jiahao..com/s?id=1654225744653405133&wfr=spider&for=pc
https://www.jianshu.com/p/066d99da7cbd
https://jiahao..com/s?id=1654225744653405133&wfr=spider&for=pc
https://blog.csdn.net/qq_31337311/article/details/80781273
https://www.cnblogs.com/jiangzhaowei/p/8996810.html
http://blog.sina.com.cn/s/blog_d2bb5eff0102wbq2.html
㈢ 请教下:网络数据传输的原理
数据在网络上是以"帧"为单位进行传输。
帧由多个部分组成,不同的部分对应不同的信息,从而实现相应的功能。
帧是根据通信所使用的协议,由网络驱动程序按照一定规则生成的,然后通过网卡发送到网络中,通过网线传送到目的主机。
在目的主机一端按照同样的通信协议执行相反的过程。接收端机器的网卡捕获到这些帧,并告诉操作系统有新的帧到达,然后对其进行存储。
在正常情况下,网卡读入一帧并进行检查。
如果帧中携带的目的地址(这里的目的地址是指物理地址而非IP地址,该地址是网络设备的唯一标志)和自己的物理地址一致,或者是广播地址(被设定为一次性发送到网络所有主机的特殊地址,当目标地址为该地址时,所有的网卡都会接收该帧),网卡通过产生一个硬件中断引起操作系统注意,然后将帧中所包含的数据传送给系统进一步处理;否则就将这个帧丢弃。
㈣ linux如何获得一个进程的网络流量
Linux下是没有文件直接给你按进程记录流量信息的。你想要编程实现的话,办法是有的,只是比较麻烦。首先,你需要能截取流经网卡的数据包,这个可以通过libpcap来完成,其次你要完成的最重要的一步就是怎么根据端口号找到进程的pid。端口号通过截取的数据包可以获得,这个时候你要按行来解析/proc/net/tcp (如果要支持ipv6的话还要解析/proc/net/tcp6),这个文件记录了当前活跃的TCP连接情况,每一行代表一条连接,我们感兴趣的是其中的inode这一项,你得把inode的值解析出来保存。然后蛋疼的时候来了,接下来你得遍历所有的/proc/pid/fd文件,察看其中每一个文件描述符,如果发现内容为socket[xxxx]的,把xxxx截取出来,这个xxxx也是inode号,如果和你之前解析/proc/net/tcp的inode号吻合,恭喜你,这说明这个pid和那个tcp连接有关系,进而也就确定了端口号和pid的对应关系,也就知道了数据包和进程之间的对应关系了。
我的建议:
先看看http://www.tcpmp.org/pcap.html, 熟悉一下libpcap库的用法,怎么截取数据包。
自己看看/proc/net/tcp的内容,想想怎么做文本解析,除了inode外,源ip,源端口号,目的ip,目的端口号都可以解析出来,而这个四元组实际就代表了一条tcp连接。
想想怎么做数据包,连接,进程的老化超时处理。比如说,当前截取的到的数据包在统计过一次流量后,下一次就不应该再计入了,怎么处理?一条连接长时间没有任何数据包的交互,怎么老化掉?一个进程长时间没有数据包的交互,甚至用户给关闭了,你的程序如何感知?libpcap截取到数据包后会给你提供截取到的时间戳,好好利用这个时间戳就可以办到。
最后,以数据包 -> 连接 -> 进程 的关系来思考会有助于你的程序设计,一条连接可以有N个数据包,一个进程可以有N条连接。这么一想,这3个结构体或者类就能定义好了。剩下的自己琢磨琢磨。
㈤ 求一款能够发现是哪个程序或进程在向网络发送数据或接收数据的软件!谢谢!
PSP终结者
㈥ 如何实现网间进程通信
网间进程通信首先必须解决以下问题。
(1)网间进程的标识问题。在同一主机中,不同的进程可以用进程号(Process ID)唯一标识。
但在网络环境下,各主机独立分配的进程号已经不能唯一地标识一个进程。例如,主机A中某进
程的进程号是5,在B机中也可以存在5号进程,进程号不再唯一了,因此,在网络环境下,仅
仅说“5号进程”就没有意义了。
(2)与网络协议栈连接的问题。网间进程的通信实际是借助网络协议栈实现的。应用进程
把数据交给下层的传输层协议实体,调用传输层提供的传输服务,传输层及其下层协议将数
据层层向下递交,最后由物理层将数据变为信号,发送到网上,经过各种网络设备的寻径和
存储转发.才能到达目的端主机,目的端的网络协议栈再将数据层层上传,最终将数据送交
接收端的应用进程,这个过程是非常复杂的。但是对于网络编程来说,必须要有一种非常简
单的方法,来与网络协议栈连接。这个问题是通过定义套接字网络编程接口来解决的。
(3)多重协议的识别问题。现行的网络体系结构有很多,如TCP/IP. IPX/SPX等,操作系统
往往支持众多的网络协议。不同协议的工作方式不同,地址格式也不同,因此网间进程通信还要解
决多重协议的识别问题。
(4)不同的通信服务的问题。随着网络应用的不同,网间进程通信所要求的通信服务就会
有不同的要求。例如,文件传输服务,传输的文件可能很大,要求传输非常可靠,无差错,无
乱序,无丢失;下载了一个程序,如果丢了几个字节,这个程序可能就不能用了。但对于网上
聊天这样的应用,要求就不高。因此,要求网络应用程序能够有选择地使用网络协议栈提供的
网络通信服务功能。在TCP/IP协议簇中,在传输层有TCP和UDP这两个协议,TCP提供可靠
的数据流传输服务,UDP提供不可靠的数据报传输服务。深入了解它们的工作机制,对于网络
编程是非常必要的。
具体请看http://www.zhaojing520.com/thread-214-1-1.html?_dsign=9cd875fb
㈦ 用winpcap捕获数据包,如何找出对应的进程
你可以先将你抓到的包保存到文件
主要代码:
/* 回调函数,用来处理数据包 */
void packet_handler(u_char *mpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
/* 保存数据包到堆文件 */
pcap_mp(mpfile, header, pkt_data);
}
然后用wireshark 这款软件,打开文件你保存抓包信息的文件,查看你抓到的包
Wireshark(前称Ethereal)是一个网络封包分析软件。
㈧ Linux下用 lsof 命令查找指定端口被哪个进程占用
lsof(list open files)是一个列出当前系统打开文件的工具。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接 和硬件。所以如传输控制协议 (tcp) 和用户数据报协议 (udp) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因 为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof使用
lsof输出信息含义:
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
command pid user fd type device size node name
init 1 root cwd dir 3,3 1024 2 /
init 1 root rtd dir 3,3 1024 2 /
init 1 root txt reg 3,3 38432 1763452 /sbin/init
init 1 root mem reg 3,3 106114 1091620 /lib/libdl-2.6.so
init 1 root mem reg 3,3 7560696 1091614 /lib/libc-2.6.so
init 1 root mem reg 3,3 79460 1091669 /lib/libselinux.so.1
init 1 root mem reg 3,3 223280 1091668 /lib/libsepol.so.1
init 1 root mem reg 3,3 564136 1091607 /lib/ld-2.6.so
init 1 root 10u fifo 0,15 1309 /dev/initctl
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
command:进程的名称
pid:进程标识符
user:进程所有者
fd:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
type:文件类型,如dir、reg等
device:指定磁盘的名称
size:文件的大小
node:索引节点(文件在磁盘上的标识)
name:打开文件的确切名称
其中fd 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读 R 或只写 w 模式。同时还有大写 的w 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 fd 都是从 3 开始。
与 fd 列相比,type 列则比较直观。文件和目录分别称为 reg 和 dir。而chr 和 blk,分别表示字符和块设备;或者 unix、fifo 和 ipv4,分别表示 unix 域套接字、先进先出 (fifo) 队列和网际协议 (ip) 套接字。
lsof常用参数
lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。例如,linux限制了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某个上限)。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。lsof语法格式是:
# lsof [options] filename
常用的参数列表:
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示command列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /dir/ 显示目录下被进程打开的文件
lsof +d /dir/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d fd 显示指定文件描述符的进程
lsof -n 不将ip转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> ipv4 or ipv6
protocol --> tcp or udp
hostname --> internet host name
hostaddr --> ipv4地址
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
例如: 查看22端口现在运行的情况
# lsof -i :22
command pid user fd type device size node name
sshd 1409 root 3u ipv6 5678 tcp *:ssh (listen)
查看所属root用户进程所打开的文件类型为txt的文件:
# lsof -a -u root -d txt
command pid user fd type device size node name
init 1 root txt reg 3,3 38432 1763452 /sbin/init
mingetty 1632 root txt reg 3,3 14366 1763337 /sbin/mingetty
mingetty 1633 root txt reg 3,3 14366 1763337 /sbin/mingetty
mingetty 1634 root txt reg 3,3 14366 1763337 /sbin/mingetty
mingetty 1635 root txt reg 3,3 14366 1763337 /sbin/mingetty
mingetty 1636 root txt reg 3,3 14366 1763337 /sbin/mingetty
mingetty 1637 root txt reg 3,3 14366 1763337 /sbin/mingetty
kdm 1638 root txt reg 3,3 132548 1428194 /usr/bin/kdm
x 1670 root txt reg 3,3 1716396 1428336 /usr/bin/xorg
kdm 1671 root txt reg 3,3 132548 1428194 /usr/bin/kdm
startkde 2427 root txt reg 3,3 645408 1544195 /bin/bash
... ...
lsof使用实例
一、查找谁在使用文件系统
在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:
# lsof /gtes11/
command pid user fd type device size node name
bash 4208 root cwd dir 3,1 4096 2 /gtes11/
vim 4230 root cwd dir 3,1 4096 2 /gtes11/
在 这个示例中,用户root正在其/gtes11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/gtes11,另一个则显示的是vim正在编辑/gtes11下的文件。要成功地卸载/gtes11,应该 在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的 目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。
二、恢复删除的文件
当linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这 些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 pid 命名的目录中,即 /proc/1234 中包含的是 pid 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信 息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
当 系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
# lsof |grep /var/log/messages
syslogd 1283 root 2w reg 3,3 5381017 1773647 /var/log/messages (deleted)
从 上面的信息可以看到 pid 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:
# head -n 10 /proc/1283/fd/2
aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
aug 4 13:50:15 holmes86 kernel: linux version 2.6.22.1-8 ([email protected]) (gccversion 4.2.0) #1 smp wed jul 18 11:18:32 edt 2007
aug 4 13:50:15 holmes86 kernel: bios-provided physical ram map:
aug 4 13:50:15 holmes86 kernel: bios-e820: 0000000000000000 - 000000000009f000 (usable)
aug 4 13:50:15 holmes86 kernel: bios-e820: 000000000009f000 - 00000000000a0000 (reserved)
aug 4 13:50:15 holmes86 kernel: bios-e820: 0000000000100000 - 000000001f7d3800 (usable)
aug 4 13:50:15 holmes86 kernel: bios-e820: 000000001f7d3800 - 0000000020000000 (reserved)
aug 4 13:50:15 holmes86 kernel: bios-e820: 00000000e0000000 - 00000000f0007000 (reserved)
aug 4 13:50:15 holmes86 kernel: bios-e820: 00000000f0008000 - 00000000f000c000 (reserved)
从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 i/o 重定向将其复制到文件中,如:
# cat /proc/1283/fd/2 > /var/log/messages
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。
# lsof -i:3306
查看3306端口被谁占用
㈨ Linux 怎么根据进程号,找对应的进程!
1、Linux根据进程号查询相应的进程信息,可以使用ps命令的-q参数来进行查询。
2、举例来说,已知进程号为12840,查询其相应的进程。
ps-q12840
说明:-o是指明输出的格式,comm=即输出格式只输出comand,即只显示进程的名称。
㈩ 电脑怎样接收网络数据
网络数据接收依次经过网卡驱动和协议栈程序,以DM9000A网卡为例进行介绍接收数据的过程。
网卡在一个数据包到来时,会产生一个硬中断,网络驱动程序会执行中断处理过程:首先申请一个skb结构及pkt_len+5大小的内存用于保存数据,然后便将接收到的数据从网卡复制到这个skb的数据部分中。当数据从网卡中成功接收后,调用netif_rx(skb)进一步处理数据,将skb加入到相应的input_pkt_queue队列中,并调用netif_rx_schele(),会产生一个软中断来执行网络协议栈的例程。这样,中断的上半部已完成,以下的工作则交由中断的下半部来实现。
下半部的内核守护线程do_softirq(),将执行net_rx_action(),对数据进行处理。IP层输入处理程序轮询处理输入队列中的每个IP数据,在整个队列处理完毕后返回。IP层验证IP首部的校验和,处理IP选项,验证IP主机地址和正确性等,并调用相应协议(TCP或者UDP等)处理程序。接收的进程在网络协议栈处理完毕后会收到唤醒的信号,并收到发送来的网络数据。