zoukankan      html  css  js  c++  java
  • 一个完整的TCP连接

    当我们向服务器发送HTTP请求,获取数据、修改信息时,都需要建立TCP连接,包括三次握手,四次分手。

    什么是TCP连接?

    为实现数据的可靠传输,TCP要在应用进程间建立传输连接。它是在两个传输用户之间建立一种逻辑联系,使得通信双方都确认对方为自己的传输连接端点。

    建立连接

    建立连接前,服务器端首先被动打开其熟知的端口,对端口进行侦听。当客户端要和服务器端建立连接时,发起一个主动打开端口的请求(该端口一般为临时端口);然后进入三次握手的过程。

    三次握手的过程:

    如图1:

    图1    三次握手

    ① A 的 TCP 向 B 发出连接请求报文段,其首部中的同步比特 SYN 应置为1,并选择序号 x,表明传送数据时的第一个数据字节的序号是 x(设置初始段序号SEQ = x ,例如SEQ = 26 500)。

    ② B 的 TCP 收到连接请求报文段后,如同意,则发回确认。
    B 在确认报文段中应将 SYN 置为 1,其确认号ACK应为 x + 1(ACK 26 501),同时也给出自己的选择序号 y(设置初始段序号SEQ = y ,例如SEQ = 29 010)。

    ③ A 收到此报文段后,向 B 给出确认,其确认号应为 y + 1(ACK = 29011)。
    A 的 TCP 通知上层应用进程,连接已经建立。
    当运行服务器进程的主机 B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程,连接已经建立。

    由于客户对报文段进行了编号,它知道哪些序号是期待的,哪些序号是过时的。当客户发现报文段的序号是一个过时的序号时,就会拒绝该报文段,这样就不会造成重复连接。

    释放连接

    数据传输结束后,通信双方都可以释放连接。

    四次分手的过程:

    如图2:

    图2    四次分手

    过程① 结束时,从 A 到 B 的连接就释放了,连接处于半关闭状态。
    相当于 A 向 B 说:“我已经没有数据要发送了。但你如果还发送数据,我仍接收。”

    过程② 结束后,至此,整个连接已全部释放。

    TCP的半关闭

    TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。图3显示了一个半关闭的典型例子。让左方的客户端开始半关闭,当然也可以由另一端开始。初始端发出的FIN,接着是另一端对这个FIN的ACK报文段。接收半关闭的一方仍能发送数据。当收到半关闭的一端在完成它的数据传送后,将发送一个FIN关闭这个方向的连接,这将传送一个文件结束符给发起这个半关闭的应用进程。当对第二个F I N进行确认后,这个连接便彻底关闭了。

    图3    TCP的半关闭

    本文链接:http://www.cnblogs.com/xsilence/p/6034361.html

  • 相关阅读:
    使用ASP.Net WebAPI构建REST服务(一)——简单的示例
    SQL Server 自定义字符串分割函数
    [转]JSP中EL表达式三元运算符的使用
    [转]JSP页面的动态包含和静态包含示例及介绍
    jstl报错:Property 'name' not found on type java.lang.String
    [转]Extjs中的迭代方法
    eclipse mars 4.5.1 自定义工具栏
    [转]Commons IO 官方文档
    【转】eclipse运行 Ant报错Could not find the main class: org.eclipse.ant.internal.launching.remote.InternalAntRunner. Program
    【转】亲测plsql Developer配置免安装oralce客户端步骤
  • 原文地址:https://www.cnblogs.com/xsilence/p/6034361.html
Copyright © 2011-2022 走看看