zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)
    关于Delphi中的字符串的浅析(瓢虫大作,里面有内存错误的举例)
    String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串(内含许多实验测试)
    了解JVM加载实例化类的原理
    轻量级 Material Design 前端框架 MDUI (纯html,css,与css框架跟react vue不冲突)
    只学一点点:我的技术学习策略(虽然不赞同,但可以参考一下,针对不常用的技术可以这样,同时可以:寻找遁去的一,不用管别人怎么想;有学习的时间,不如自己写、自己实践,否则学完了都不知道是什么东西)
    clientdataset<---->json
    完全自定义窗体风格的实现
    监控其它进程
    用JSP+JavaBean开发模式实现一个销售额的查询
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/5979757.html
Copyright © 2011-2022 走看看