zoukankan      html  css  js  c++  java
  • linux网络编程中的基本概念

    int close(int fd)(假设是服务器端)

    close 关闭了自身数据传输的两个方向。close一个TCP套接字的默认行为是把该套接字标记成已关闭,然后立即返回到调用进程。该套接字描述符不能再由调用进程使用,也就是说它不能作为read或write的第一个参数。然而TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后发生的是正常的TCP连接终止序列。

    我们可以通过SO_LINGER套接字选项可以用来改变TCP套接字的这种默认行为。

    注意:close会先尝试发送  在本套接字socket发送缓冲区的数据,然后进行TCP释放的操作,(正常情况是释放的4个分节),但是close默认情况只是,close的默认返回成功也只是成功发出了一个FIN分节,也不代表对端已经确认。

    如果close的时候,此套接字的接收缓冲区中还有数据没有被应用层读取,此时关闭socket会导致直接向对端发送RST(close之后,此端主动传送RST),http://my.oschina.net/costaxu/blog/127394第三种情况

    服务器端close之后,套接字描述符的引用计数减1,如果为0时,(套接字是文件),套接字就被关闭了。此时在服务器端调用read或者write(fd.....)就会出现ERRNO=EBADF /* Bad file descriptor */的错误。

     
     
     
     
    shutdown(fd, SHUT_RD)告诉内核,我绝食了,再有吃的来(数据),不要放我的餐桌上了(接收缓冲区)直接扔给狗吃把。(但是此时还是可以发送给接收缓冲区,只是被TCP抛弃而已)
    shutdown(fd, SHUT_WR)内核发送FIN给对方数据发送完毕了
    得知 shut_RD不发送FIN,shut_rw比较主动的发出FIN

    shutdown函数的作用

    shutdown:SHUT_RD:read没有影响,只是返回0;

    关闭连接的读这一半,进程不能再对这样的套接字调用任何读操作;

    在套接字上不能再发出接收请求,进程仍可往套接字发送数据,套接字接收缓冲区中所有数据被丢弃,此套接字再接收到的任何数据由TCP丢弃,对套接字发送缓冲区没有任何影响;

    shutdown:SHUT_WR   : 但是在调用shutdown关闭写之后不能再调用write方法,会引起错误终止程序,这里和上面的关闭读有差别,其实是在已发送FIN包后write该socket描述符会引发EPIPE/SIGPIPE。

    关闭连接的写这一半,进程不能再对这样的套接字调用任何写操作;

    在套接字上不能再发出发送请求,进程仍可从套接字接收数据,套接字发送缓冲区中的内容被发送到对端,后跟正常的TCP连接终止序列(即发送FIN),对套接字接收缓冲区无任何影响;

    服务器shutdown:SHUT_RD之后,然后此端口read(fd)会返回0,说明文件末尾,http://blog.chinaunix.net/uid-23629988-id-3035613.html

    Linux的版本是kernel-2.6.21: 

      1,只要TCP栈的读缓冲里还有未读取(read)数据,则调用close时会直接向对端发送RST。 

      2,shutdown与socket描述符没有关系,即使调用shutdown(fd, SHUT_RDWR)也不会关闭fd,最终还需close(fd)。 

      3,可以认为shutdown(fd, SHUT_RD)是空操作,因为shutdown后还可以继续从该socket读取数据,这点也许还需要进一步证实。 

      4,在已发送FIN包后write该socket描述符会引发EPIPE/SIGPIPE。 

      5,当有多个socket描述符指向同一socket对象时,调用close时首先会递减该对象的引用计数,计数为0时才会发送FIN包结束TCP连接。shutdown不同,只要以SHUT_WR/SHUT_RDWR方式调用即发送FIN包。 

      6,SO_LINGER与close,当SO_LINGER选项开启但超时值为0时,调用close直接发送RST(这样可以避免进入TIME_WAIT状态,但破坏了TCP协议的正常工作方式),SO_LINGER对shutdown无影响。 

      7,TCP连接上出现RST与随后可能的TIME_WAIT状态没有直接关系,主动发FIN包方必然会进入TIME_WAIT状态,除非不发送FIN而直接以发送RST结束连接。

  • 相关阅读:
    在一天的24小时之中,时钟的时针、分针和秒针完整重合在一路的时辰有几回?都分辨是什么时光?你如何算出来的?
    12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)
    Bootstrap4默认样式不对胃口?教你使用NPM+Webpack+SASS来定制
    Java 内存模型和 JVM 内存结构真不是一回事
    还在为垂直居中苦恼?CSS 布局利器 flexbox 轻轻松松帮你搞定
    这 3 个 Set 集合的实现有点简单,那来做个总结吧
    TreeMap 还能排序?分析下源码就明白了
    红黑树这个数据结构,让你又爱又恨?看了这篇,妥妥的征服它
    模拟实现 Tomcat 的核心模块:NIO,HTTP,容器和集群
    「福利」Java Swing 编写的可视化算法工程,包含树、图和排序
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4439454.html
Copyright © 2011-2022 走看看