这段时间在做一些web方面开发的事情,用的Nginx+fast-cgi,计划深入看一下Nginx的内部实现和架构,以方便理解和调优。后面准备写一篇有关Nginx介绍和深度解析的文章,要深入理解web服务器的工作原理,网络编程的基本概念和知识不可或缺。这篇文章先对于网络编程中比较容易混淆的几个问题做一个复习和总结,主要参考自《unix网络编程》这本书。

    首先,简单总结一下传输层tcp协议的两个琐碎的点。

1、TIME_WAIT状态问题:tcp三次握手建立连接,四次挥手来释放连接,这个大家都熟悉。在释放连接时,主动发起关闭连接的一方的一方会在发送最终确认ack后会有一个TIME_WAIT的状态,如下图所示:

这个状态的持续时间一般是2MSL(maximum segment lifetime),也就是2倍的最长分节生命周期,对于MSL,比较老的数据是30s到2min之间。这个状态存在的理由,有两点:a)、实现终止TCP全双工连接的可靠性(因为客户端的最终ACK可能丢失,从而服务器端会再次发送FIN请求,客户端需要能够应对这种情况的发生,等待新的FIN请求到达后,可以再发送一次最终ACK。旧的ACK丢失到新的FIN到达的时间间隔,最大就是2MSL);b)、允许老的重复分节在网络中消逝(也即,同样的ip、端口建立新的连接时,新的tcp连接和旧的tcp连接的四元组相同,TIME_WAIT状态的引入可以避免将旧的tcp连接网络延迟的数据当做新的tcp连接的数据)

2、四元组,socket套接口用来识别不同tcp连接的一个数据结构,(本地IP地址,本地tcp端口号,远程IP地址,远程tcp端口号),四元组只要有一项不同,就可以认为是不同的连接。其中端口号是一个16bit的数,单机端口数目的最大值是65535。前两天水木上有一个问题,关于多机Nginx做服务器时,最大连接数什么的,具体问题可能要更复杂一些,记不清楚了,但如何判断什么的还是离不开这些基础知识,那个当时我存了合集,有空再去研究一下那个问题。

下面,总结澄清一下阻塞、非阻塞、IO复用、异步、同步、信号驱动的区别和联系,这些是网络编程中比较容易混淆的概念。

总体上讲,应用程序从网络中拿数据,要经历两个阶段:1、数据分组到达网络,并被拷贝到内核的某个缓冲区中,数据报准备好;2、数据从内核缓冲区拷贝至用户态应用程序的缓冲区。基于这两个过程,下面先给出各种IO模式的调用图,最后给出异步、同步IO等区分等。

阻塞I/O:

    非阻塞I/O:

  I/O复用模型(select、poll等):

  信号驱动IO模型:

  异步I/O模型:

各种I/O模型的对比,除了异步I/O,其他几种I/O模型等的主要区别在第一阶段也即得知数据报准备好这一过程,第二个阶段(从内核向应用程序缓冲区拷贝)都一样,而异步I/O的两个阶段都与其他模型不一样:

阻塞什么的理解了,那么到底什么是同步I/O、什么是异步I/O呢,Posix.1的响应术语定义如下:

同步I/O:操作引起请求进程阻塞,直到I/O操作完成,因此阻塞I/O、非阻塞I/O(注意,非阻塞只是接受数据的第一阶段,第二阶段还是阻塞的)、I/O复用模型和信号驱动型I/O模型都是同步I/O模型;

异步I/O:不引起请求进程阻塞,因此只有上面两个阶段都不阻塞的异步模型才是符合定义的异步I/O。

tcp连接以及网络I/O的几个问题的更多相关文章

  1. TCP连接之报文首部

    在面试时,会经常被问到TCP报文的一些细节,可以说TCP报文是不少企业用来考察面试者对网络的掌握程度的一道题目. TCP连接作为网络传输的一个环节,是不可或缺的一部分.例如,OSI七层模型的应用层HT ...

  2. Linux 建立 TCP 连接的超时时间分析(解惑)

    Linux 系统默认的建立 TCP 连接的超时时间为 127 秒,对于许多客户端来说,这个时间都太长了, 特别是当这个客户端实际上是一个服务的时候,更希望能够尽早失败,以便能够选择其它的可用服务重新尝 ...

  3. TCP连接的建立与释放(超详细)

    前言:在计算机网络协议中,TCP只是其中一个,然而在网络使用中,TCP也是最离不开的协议之一,它的重要性毋庸置疑,最最重要的是,面试的重点就是它啊,呜呜~~,今天我们一起来看下TCP的连接建立与释放, ...

  4. 【网络协议】TCP连接的建立和释放

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20 ...

  5. UNIX网络编程——TCP连接的建立和断开、滑动窗口

    一.TCP段格式: TCP的段格式如下图所示: 源端口号与目的端口号:源端口号和目的端口号,加上IP首部的源IP地址和目的IP地址唯一确定一个TCP连接. 序号:序号表示在这个报文段中的第一个数据字节 ...

  6. 网络学习笔记(一):TCP连接的建立与关闭

      五层网络模型分为:物理层.数据链路层.网络层.传输层.应用层.其中,传输层有两种主要协议:面向连接的TCP(Transmission Control Protocol 传输控制协议).无连接的UD ...

  7. 【RL-TCPnet网络教程】第15章 RL-TCPnet之创建多个TCP连接

    第15章     RL-TCPnet之创建多个TCP连接 本章节为大家讲解RL-TCPnet的TCP多客户端实现,因为多客户端在实际项目中用到的地方还挺多,所以我们也专门开启一个章节做讲解.另外,学习 ...

  8. python网络编程--TCP连接的三次握手(三报文握手)与四次挥手

    一.TCP连接 运输连接有三个阶段: 连接建立.数据传送和连接释放. 在TCP连接建立过程中要解决以下三个问题: 1,要使每一方能够确知对方的存在. 2.要允许双方协商一些参数(如最大窗口之,是否使用 ...

  9. Linux网络IO函数以及TCP连接函数包装

    标准I/O VS 网络IO 标准I/O又称为标准I/O流,从某种意义上讲是全双工的,因为程序能够在同一个流上执行输入和输出. Unix/Linux对网络的抽象是一种称为套接字的文件类型.和任何Unix ...

随机推荐

  1. DynamicReports 导出Excel 例子

    import java.awt.Color; import java.io.FileOutputStream; import java.util.ArrayList; import java.util ...

  2. BZOJ 1004 HNOI2008 Cards Burnside引理

    标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...

  3. Mono 4 和Jexus 5.6

    Mono 4 和Jexus 5.6 概述 在这篇文章中我们将讨论如何在CentOS 7操作系统,安装 jexus. mono 和 配置 jexus,因此它将能够在这种环境中运行一个asp.net mv ...

  4. paramiko socket.error: Int or String expected

    paramiko socket.error: Int or String expected paramiko的环境: Python 2.6.6 paramiko==1.14.0 正常的paramiko ...

  5. java_log4j 经典配置

    程序加载制定日志文件 public static final String log4j = "log4j.xml"; /** * @declare 加载log4j * @throw ...

  6. WebBrowser控件使用详解

    原文:WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 G ...

  7. CSS3 制作向左、向右及关闭图标的效果

    先看一下效果 1.鼠标移入前的效果 2.鼠标移入的效果 3.制作步骤如下: 轮廓的CSS,就是利用圆角和宽度高度,制作出一个圆: <style> /*显示方式为 inline-block* ...

  8. 整理Ruby相关的各种概念(rvm, gem, bundle, rake, rails等)

    转自:http://henter.me/post/ruby-rvm-gem-rake-bundle-rails.html Ruby 这个就不用多说了 RVM 用于帮你安装Ruby环境,帮你管理多个Ru ...

  9. Coreseek/sphinx全文检索的了解

    Coreseek/sphinx全文检索的了解 概述: 全文检索是一种将文件里全部文本与检索项匹配的文字资料检索方法,全文检索是将存储于数据库中整本书.整篇文章中的随意内容信息查找出来的检索.它能够依据 ...

  10. Android 2.3 版本中链接边框问题解决

    在做移动互联网开发的过程中,同样需要考虑到移动终端(如手机.平板)的不同版本浏览器兼容问题,在Android 2.3 版本的默认浏览器中有一个bug-会自动给所有链接文本在点击操作过程中加黄色或绿色边 ...