• TCP 介绍


    TCP介绍

            TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1]  另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

    TCP交互过程包括三次握手和四次关闭。

    客户端TCP状态迁移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

    服务器TCP状态迁移:CLOSED->LISTEN->SYN-RECEIVED->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

    • 基本TCP客户—服务器程序基本框架

    TCP的状态

    LISTEN - 侦听来自远方TCP端口的连接请求; 

    SYN-SENT -在发送连接请求后等待匹配的连接请求; 

    SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认; 

    ESTABLISHED- 代表一个打开的连接,数据可以传送给用户; 

    FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

    FIN-WAIT-2 - 从远程TCP等待连接中断请求; 

    CLOSE-WAIT - 等待从本地用户发来的连接中断请求; 

    CLOSING -等待远程TCP对连接中断的确认; 

    LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认; 

    TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认; 

    CLOSED - 没有任何连接状态。

    TCP三次握手

    TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如下图所示。

    1)第一次握手:建立连接时,客户端A发送SYN包(SYN=x)到服务器B,并进入SYN_SENT状态,等待服务器B确认。

    2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=x+1),同时自己也发送一个SYN包(SYN=y),即SYN+ACK包,此时服务器B进入SYN_RCVD状态。

    3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=y+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

    完成三次握手,客户端与服务器开始传送数据。

    确认序号:其数值等于发送方的发送序号 +1(即接收方期望接收的下一个序列号)。

    TCP四次关闭

    TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

    1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

    2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

    3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

    4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

    以客户机发起关闭连接为例:1.服务器读通道关闭,2.客户机写通道关闭,3.客户机读通道关闭,4.服务器写通道关闭。

    详细过程:

    第一阶段 客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i;
    1.服务器收到FIN(u)后,返回确认段ACK,序列号为u+1,关闭服务器读通道;
    2.客户机收到ACK(u+1)后,关闭客户机写通道;
    (此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据)

    第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j;
    3.客户机收到FIN(w)后,返回确认段ACK,序列号为w+1,关闭客户机读通道;
    4.服务器收到ACK(w+1)后,关闭服务器写通道。
    这是标准的TCP关闭两个阶段,服务器和客户机都可以发起关闭,完全对称。

    参考文章:http://www.cnblogs.com/Jessy/p/3535612.html

    http://blog.csdn.net/u010275850/article/details/46349689

  • 相关阅读:
    (转)解读Flash矩阵
    Size Classes with Xcode 6
    Android viewPage notifyDataSetChanged无刷新
    pgbouncer 源码编译安装
    在greenplum中创建master only 表
    创建函数查询greenplum使用到某个数据表的所有视图
    greenplum 视图权限
    创建视图查询所有segment 实例上的会话状态
    greenplumdb 元数据检查gpcheckcat 问题修复一例
    pg_dump 备份greenplum db 报错退出
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/5979757.html
Copyright © 2020-2023  润新知