这段时间在做一些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. Android 内存管理 &Memory Leak & OOM 分析

    1.Android 流程管理&内存 Android主要应用在嵌入式设备其中.而嵌入式设备因为一些众所周知的条件限制,通常都不会有非常高的配置,特别是内存是比較有限的. 假设我们编写的代 码其中 ...

  2. maven_基本配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. 怎样将short[]数组转换成byte[]数组

    byte[] byteArray = Array.ConvertAll<short, byte>(shortArray, Convert.ToByte);

  4. nginx 开展对RT5350

    编译成功nginx的mips该平台后,,至make install生成的文件到一个角落rt5350文件系统. 必须指出的是,在,被放置在文件系统中需要安装文件夹和编译一致:候有release的文件夹, ...

  5. ShellExecuteEx的使用方法

    关于怎样在c++中启动外部的exe程序,之前看到在百度一搜就看到了: ShellExecute(this->m_hWnd,"open","calc.exe" ...

  6. jquery+css3打造一款ajax分页插件

    原文:[原创]jquery+css3打造一款ajax分页插件 最近公司的项目将好多分页改成了ajax的前台分页以前写的分页插件就不好用了,遂重写一个 支持IE6+,但没有动画效果如果没有硬需求,个人认 ...

  7. Linux下php+mysql+nginx编译搭建(一)

    之前一直都是一键搭建的webserver,可是一键搭建的环境相对来说都是比較老的.假设要用比較新的环境,特别是正式server,就必须自己手动编译搭建了(下面搭建基于linux centos6.5 3 ...

  8. 快速构建Windows 8风格应用17-布局控件

    原文:快速构建Windows 8风格应用17-布局控件 本篇博文主要介绍三种常用的布局控件:Canvas.Grid.StackPanel. Panel类是开发Windows 8 Store应用中一个重 ...

  9. selenium2入门 用Yaml文件进行元素管理 (五)

    比如界面有一个按钮,id号是test.如果进行对象化的话,就是test.click就可以了.不用每次都要去创建test对象.如果id号变了,我们也只需要改一下test的名称就行了. 使用Yaml需要用 ...

  10. 过度补脑系列:Nokia的不归路

    没有数据,没有调查,只是突然想起诺基亚... 23号的一节酱油课,脑海中突然闪过两个关键字--nokia & android 于是用手机百度了一下,竟然真的出了新机型,NokiaX,X东24日 ...