顶尖网站设计,代运营主要做什么,中企动力销售好处单吗,wordpress登录页logo修改TCP连接和释放
一个典型的TCP连接、通信过程#xff1a;
#xff08;假设有资源的一端是服务器端#xff09;
服务器会启用一个监听循环#xff0c;不断接受client连接请求(三次握手建立连接), 进行数据通信#xff0c;通信完成以后断开连接(四次挥手断开连接)。
对于…TCP连接和释放
一个典型的TCP连接、通信过程
假设有资源的一端是服务器端
服务器会启用一个监听循环不断接受client连接请求(三次握手建立连接), 进行数据通信通信完成以后断开连接(四次挥手断开连接)。
对于client在server启用监听循环时向server发出连接请求接收server数据如有必要向server发送数据通信完成后断开连接。
客户端 socketbindconnet变为主动套接字。服务器socketbindlisten变为监听套接字accpet。
连接是指物理上一端client到另一端server的通信链路通过server端ip, port与客户端ip, port来唯一标识一个TCP连接。 TCP连接有长连接、短连接之分
短连接client和server建立连接后一般只传递一次读写操作然后由client发起close发送FIN分节关闭连接。短连接只完成一次read/write操作就会自动关闭。
长连接client和server建立连接后并不会自动关闭后续的read/write操作会继续用这个连接。长连接没有确切时间限制可能会长时间存在。
什么是读方向什么是写方向
读方向从TCP连接中接收数据的操作。进程从TCP连接中读取来自远端的数据。应用程序正在执行读操作它是在接收对方发送过来的数据。
写方向通过TCP连接发送数据的操作。进程向TCP连接中写入数据以发送给远端的应用程序。执行写操作时你是在向对方发送数据。
为什么“方向”会是操作
以读方向为例应用程序从网络接收数据的过程。在这个过程中数据是从远程主机流向本地主机的。这里的“读”实际上是一个动作或操作它代表的是本地进程从TCP连接中获取来自远端进程的数据的行为。
两个方向并不直接指向某个实体而是描述了数据在两个网络节点之间的流动方式以及每个节点上的应用程序如何与这种流动进行交互。
close和shutdown有什么区别
对于TCP连接来说正常情况下应该先关闭写方向即不再发送数据然后继续处理可能还在传输中的数据(读方向)参见下一个问题。
直接调用close()会同时关闭读写两个方向并释放套接字相关的资源。就是说调用close的一方不能读写另一方相当于强制关闭连接。如果TCP缓冲区有残留数据没有读或写会直接丢失。
close关闭连接和套接字
#includeunistd.h
int close(int fd);
close会把描述符(sockfd)引用计数-1, 当计数为0时, 才真正断开连接、关闭套接字。
引用计数联系软链接和硬连接shared_ptr和其他垃圾回收算法
close终止读、写两个方向的数据传送
对读方向, 内核将套接字设置为不可读, 任何读操作都会返回异常。
对写方向, 内核尝试将发送缓冲区中的数据发送给对端, 最后发送FIN分节, 接下来如果再对该套接字进行写操作会返回异常。如果对端还继续发送数据, 就会响应RST分节。
shutdown关闭连接的一个方向, 具体取决于参数how. 成功返回0; 失败为-1, errno被设置
#includesys/socket.h
int shutdown(int sockfd, int how);
how有3个值:
SHUT_RD 关闭连接的读方向, 不能再通过套接字读取数据(读操作会直接返回EOF), 而且套接字接收缓冲区现有数据都被丢弃. 如果再收到新数据, 会对数据进行ACK, 然后直接丢弃.SHUT_WR 关闭连接的写方向, 常称为半关闭 half-close. 现有发送缓冲区的数据将会被发送掉, 后跟FIN分节. 如果程序对该套接字进行写操作, 会报错。SHUT_RDWR 连接的读半部和写半部都关闭,与调用shutdown两次等效shutdown(sockfd, SHUT_RD) shutdown(sockfd, SHUT_WR)。 shutdown和close区别
close关闭2个方向连接, 并释放连接对应资源(套接字)而shutdown不会释放所有资源;close有引用计数的概念, 只有计数为0时, 才会释放套接字资源; shutdown没有引用计数, 是直接释放how指定的资源。close后, 只有引用计数为0时, 才会发送FIN分节。 以SHUT_WR或SHUT_RDWR为参数调用shutdown时, 总会发送FIN分节。
当服务器端调用close时客户端对应的server fdconnet返回的文件描述符会发生什么变化
TCP连接的终止
在服务器端调用 close(fd) 后如果该 fd 是一个用于TCP通信的套接字描述符并且这是最后一个指向该套接字的引用那么这将启动TCP连接的正常关闭过程。服务器会尝试发送一个FIN包给客户端表示它已经完成了数据发送。
客户端状态变化
客户端会收到一个来自服务器的FIN包.此时客户端的套接字进入CLOSE_WAIT状态表明它已经收到了服务器关闭其写方向的通知。
如果客户端也有数据要发送完毕则可以继续发送直到完成。一旦所有数据发送完毕客户端应用程序应当也调用close()来关闭其对应的套接字文件描述符,客户端发送一个FIN包给服务器通知服务器它也不会再发送数据了。
在客户端成功发送FIN后客户端的套接字状态会从LAST_ACK转变为CLOSED前提是它收到来自服务器对最后ACK的确认。
残留数据处理在服务器端调用close()之后如果还有未被客户端读取的数据留在TCP连接的缓冲区中这些数据将会丢失因为服务器端已明确表示不再继续该连接上的任何通信。
半关闭连接如果你只想关闭某一方向的数据传输而非立即完全关闭连接可以考虑使用shutdown()函数而不是close()。 什么是文件描述符的引用计数
在Linux系统中一个套接字的引用计数是指内核跟踪当前有多少个进程正在使用这个套接字。
使用引用计数防止了资源被提前释放或意外关闭。
在Linux内核中多个进程或线程可能会共享同一个资源如文件、套接字等。为了确保这些资源在进程使用时不会被释放内核对每个文件描述符使用引用计数来表示。每当一个新的进程开始使用一个资源时相应的引用计数增加。当进程停止使用该资源时引用计数减少。只有当引用计数降至0时资源才会被真正释放。(与shared_ptr类似
为什么一个套接字引用计数会大于0
比如当你通过socket()系统调用来创建一个新套接字时该套接字的引用计数初始为1。随着更多的进程或线程打开相同的套接字(如通过dup()或fork()后)引用计数相应增加。
每次对该套接字执行close()操作时引用计数减1。只有当引用计数降到0时套接字才会被彻底关闭并且相关的资源会被回收。
假设有一个服务器程序它创建了一个监听套接字用于接受客户端连接
int listener socket(AF_INET, SOCK_STREAM, 0);
bind(listener, ...); // 绑定地址和端口
listen(listener, ...); // 开始监听
此时监听套接字的引用计数为1。如果一个客户端连接到这个服务器服务器通过accept()接受连接
int client_fd accept(listener, ...);
这时client_fd代表了一个新的套接字描述符用于与客户端通信而listener仍然保持打开状态以接受其他可能的连接。这里listener的引用计数仍然是1因为只有一个进程在使用它。
如果服务器程序通过fork()为每个客户端创建一个子进程来处理连接那么每个子进程都会继承父进程中打开的文件描述符包括监听套接字和其他已建立连接的套接字。如果有5个子进程同时运行监听套接字的引用计数将变为61个父进程5个子进程。 文章转载自: http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.coatingonline.com.cn.gov.cn.coatingonline.com.cn http://www.morning.yppln.cn.gov.cn.yppln.cn http://www.morning.pjrql.cn.gov.cn.pjrql.cn http://www.morning.qphcq.cn.gov.cn.qphcq.cn http://www.morning.tfei69.cn.gov.cn.tfei69.cn http://www.morning.vaqmq.cn.gov.cn.vaqmq.cn http://www.morning.bhpjc.cn.gov.cn.bhpjc.cn http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn http://www.morning.spnky.cn.gov.cn.spnky.cn http://www.morning.kwwkm.cn.gov.cn.kwwkm.cn http://www.morning.gdgylp.com.gov.cn.gdgylp.com http://www.morning.bfcrp.cn.gov.cn.bfcrp.cn http://www.morning.swbhq.cn.gov.cn.swbhq.cn http://www.morning.ngcth.cn.gov.cn.ngcth.cn http://www.morning.fwkq.cn.gov.cn.fwkq.cn http://www.morning.dlurfdo.cn.gov.cn.dlurfdo.cn http://www.morning.qwwhs.cn.gov.cn.qwwhs.cn http://www.morning.dddcfr.cn.gov.cn.dddcfr.cn http://www.morning.dnydy.cn.gov.cn.dnydy.cn http://www.morning.pfkrw.cn.gov.cn.pfkrw.cn http://www.morning.qxmys.cn.gov.cn.qxmys.cn http://www.morning.rgfx.cn.gov.cn.rgfx.cn http://www.morning.jgncd.cn.gov.cn.jgncd.cn http://www.morning.rhkq.cn.gov.cn.rhkq.cn http://www.morning.stcds.cn.gov.cn.stcds.cn http://www.morning.bnzjx.cn.gov.cn.bnzjx.cn http://www.morning.xltwg.cn.gov.cn.xltwg.cn http://www.morning.ptwzy.cn.gov.cn.ptwzy.cn http://www.morning.zqxhn.cn.gov.cn.zqxhn.cn http://www.morning.qczpf.cn.gov.cn.qczpf.cn http://www.morning.fplqh.cn.gov.cn.fplqh.cn http://www.morning.fdmfn.cn.gov.cn.fdmfn.cn http://www.morning.xbptx.cn.gov.cn.xbptx.cn http://www.morning.cwcdr.cn.gov.cn.cwcdr.cn http://www.morning.dnzyx.cn.gov.cn.dnzyx.cn http://www.morning.phcqk.cn.gov.cn.phcqk.cn http://www.morning.zwckz.cn.gov.cn.zwckz.cn http://www.morning.bsqbg.cn.gov.cn.bsqbg.cn http://www.morning.xdttq.cn.gov.cn.xdttq.cn http://www.morning.kbntl.cn.gov.cn.kbntl.cn http://www.morning.spfh.cn.gov.cn.spfh.cn http://www.morning.qnftc.cn.gov.cn.qnftc.cn http://www.morning.jbfzx.cn.gov.cn.jbfzx.cn http://www.morning.rfrx.cn.gov.cn.rfrx.cn http://www.morning.qbgdy.cn.gov.cn.qbgdy.cn http://www.morning.dpgdj.cn.gov.cn.dpgdj.cn http://www.morning.ffksr.cn.gov.cn.ffksr.cn http://www.morning.kdgcx.cn.gov.cn.kdgcx.cn http://www.morning.fhjnh.cn.gov.cn.fhjnh.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.rwjh.cn.gov.cn.rwjh.cn http://www.morning.ykrkb.cn.gov.cn.ykrkb.cn http://www.morning.ncqzb.cn.gov.cn.ncqzb.cn http://www.morning.qttg.cn.gov.cn.qttg.cn http://www.morning.hqxyt.cn.gov.cn.hqxyt.cn http://www.morning.rbxsk.cn.gov.cn.rbxsk.cn http://www.morning.pbygt.cn.gov.cn.pbygt.cn http://www.morning.rdlrm.cn.gov.cn.rdlrm.cn http://www.morning.mqfw.cn.gov.cn.mqfw.cn http://www.morning.rkmhp.cn.gov.cn.rkmhp.cn http://www.morning.yqqgp.cn.gov.cn.yqqgp.cn http://www.morning.wkcl.cn.gov.cn.wkcl.cn http://www.morning.rkfwr.cn.gov.cn.rkfwr.cn http://www.morning.nfpct.cn.gov.cn.nfpct.cn http://www.morning.xyrw.cn.gov.cn.xyrw.cn http://www.morning.mrqwy.cn.gov.cn.mrqwy.cn http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn http://www.morning.yqhdy.cn.gov.cn.yqhdy.cn http://www.morning.rynq.cn.gov.cn.rynq.cn http://www.morning.wdlyt.cn.gov.cn.wdlyt.cn http://www.morning.lkmks.cn.gov.cn.lkmks.cn http://www.morning.mnyzz.cn.gov.cn.mnyzz.cn http://www.morning.dnhdp.cn.gov.cn.dnhdp.cn http://www.morning.lfmwt.cn.gov.cn.lfmwt.cn http://www.morning.qgjxt.cn.gov.cn.qgjxt.cn http://www.morning.zgdnd.cn.gov.cn.zgdnd.cn http://www.morning.dxhnm.cn.gov.cn.dxhnm.cn http://www.morning.hymmq.cn.gov.cn.hymmq.cn http://www.morning.yqpck.cn.gov.cn.yqpck.cn