服务器的tcp进程为什么是被动打开

服务器的tcp进程为什么是被动打开,第1张

tcp被动打开,前提是你listen,这个被动打开的前提。你listen过后,其实创建了一个监听套接字,专门负责监听,不会负责传输数据。
当第一个syn包到达你的服务器时,其实linux 内核并不会创建sock结构体,而是创建一个轻量级的request_sock结构体,里面能唯一确定某个客户端发来的syn的信息,接着我们就发送syn、ack给客户端,对的,服务器就做了这2个动作,1:建立request_sock,2:回复syn、ack。
客户端肯定接着回ack,这时,我们能从ack中,取出信息,在一堆request_sock匹配,看看是否之前有这个ack对应的syn发过来过。如果之前发过syn,那么现在我们就能找到request_sock,也就是客户端syn时建立的request_sock。此时,我们内核才会为这条流创建sock结构体,毕竟,sock结构体比request_sock大的多,犯不着三次握手都没建立起来我就建立一个大的结构体吧,三次握手没建立起来我就建立一个轻量级的request_sock,当三次握手建立以后,我就建立一个相对完整的sock,所谓相对完整,其实也是不完整,因为如果你写过socket程序你就知道,所谓的真正完整,是建立socket,而不是sock(socket结构体中有一个指针sock sk,显然sock只是socket的一个子集)。那么我们什么时候才会创建完整的socket,或者换句话说,什么时候使得sock结构体和文件系统关联从而绑定一个fd,用这个fd就可以用来传输数据呢?
如果你有socket编程经验,那么你一定能想到,那就是在accetp系统调用时,返回了一个fd,所以说,是你在accept时,你三次握手完成后建立的sock才绑定了一个 fd。

用fuser杀掉进程一,为什么要使用fuser 先说 fuser的作用,
fuser能识别出正在对某个文件或端口访问的进程 大家想一下,还有哪个命令具备这个功能 没错,是lsof, 我们前面讲过,
lsof能够找出正在对指定文件访问的进程, 那么它们两者之间有何区别
fuser有一个特别的用法在于它可以一次杀死那些正在访问指定文件的进程 二,如何使用fuser
1,如何用fuser得到正在使用指定文件的进程 用法: fuser 文件
说明:它会把正在使用当前文件的进程id列出 [root@localhost lhd]# umount / umount:
/: device is busy (In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1))
[root@localhost lhd]# fuser / /: 1rc 2rc
3rc 4rc 5rc 6rc 7rc 80rc 82rc 84rc 85rc 153rc
157rc 158rc 160rc 165rc 168rc 203rc
204rc 205rc 253rc 441rc 444rc 516rc 521rc 524rc 582rc 583rc
584rc 633rc 1052rc 1392rc 1394rc 1417rc
1597rc 1609rc 1617rc 1620rc 1683rc 1744rc 1783r
1785rc 1788rc 1806r 1808r 1810rc 1811rc 1812rc
1813rc 1814rc 1815rc 1848rc 1886rc 1899rc 1900rc 2001rc
太多不一一列出 说明:
这些进程号后面的rc是什么意思 c 将此文件作为当前目录使用。 e
将此文件作为程序的可执行对象使用。 r 将此文件作为根目录使用。 s
将此文件作为共享库(或其他可装载对象)使用 2,如何列出进程的详细信息,而不仅仅是进程id 用
-v参数即可 说明: -v: 含义是:verbose output,详细的输出信息 例子:
[root@dev ~]# fuser /var/log /var/log: 4196c
[root@dev ~]# fuser -v /var/log
USER PID ACCESS COMMAND /var/log: root 4196
c bash 3,如何列出进程所属的用户 用 -u参数即可 说明: -u: 含义:display
user IDs,显示用户id 例子: [root@dev ~]# fuser -u
/var/log /var/log: 4196c(root)
4,如何杀死所有正在访问指定文件的进程 用 -k参数即可 说明: -k:含义: kill processes
accessing the named file 例子: [root@localhost lhd]# fuser
-v /root/installlog 用户 进程号 权限 命令
/root/installlog: root 3185 f tail [root@localhost lhd]#
fuser -k /root/installlog /root/installlog: 3185
[root@localhost lhd]# fuser -v /root/installlog 说明:
-k参数能够杀死所有的正在访问指定文件的进程,所以用来杀进程时非常方便 说明之二: fuser如何杀死的进程?
它发送的是这个信号:SIGKILL三,多学一点知识 1,fuser可以列出它所知的信号:
用 -l参数即可 例子: [root@dev ~]# fuser -l HUP INT
QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT
CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED 2,fuser可以发送它已知的信号给访问的指定文件进程而代替-k参数默认发送的SIGKILL
例如:只是挂起进程,那么发送HUP信号就可以了 例子: [root@localhost lhd]#
fuser -v /root/installlog 用户 进程号 权限
命令 /root/installlog: root 3347 f tail
[root@localhost lhd]# fuser -k -SIGHUP /root/installlog
/root/installlog: 3347 [root@localhost lhd]# fuser -v
/root/installlog


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10771466.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-11
下一篇2023-05-11

发表评论

登录后才能评论

评论列表(0条)

    保存