美文网首页
TCP协议基础知识

TCP协议基础知识

作者: 天渊hyominnLover | 来源:发表于2018-08-15 11:04 被阅读1次

    TCP连接简介

    • TCP报文包括TCP首部和TCP数据部分,被包装成为IP传输数据,是一种基于连接的字节流传输协议
    • 大小通常为20字节
    • TCP/IP协议族:


      TCP-IP协议族.jpg

    TCP技术详述

    TCP报文格式

    1. 序号:32位的Seq序号,标识从TCP源端向目的端发送的字节流,发送方发送数据时进行标记
    2. 确认号:32位的Ack序号,Ack=Seq+1,只有当Ack标志位为1时,该Ack确认号才有效;确认号表示发出方希望获得的对方下一次报文的Seq序号
    3. 标志位:6个标志位,分别是URG、ACK、PSH、RST、SYN、FIN,含义如下
    • URG:紧急指针(urgent pointer)有效
    • ACK:确认序号(Ack)有效
    • PSH:接收方应该尽快将报文交给应用层
    • RST:重置连接
    • SYN:发起一个新连接
    • FIN:释放一个连接
    • TCP报文结构图:


      TCP数据包.png

    TCP三次握手

    三次握手(Three-way Handshake),指的是建立一个TCP连接时,需要客户端和服务器发送三个包

    其目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息

    在socket编程中,客户端执行connect()时,将触发三次握手:

    1. 第一次握手:
    • client发送syn报文(此时SYN标志位为1),将自己的序号Seq设置为X
    • client当前状态:SYN-SENT(同步发送)
    • server当前状态:LISTEN(监听)
    • 该报文不携带数据,消耗一个序号
    1. 第二次握手:
    • server发回确认包进行应答,SYN标志位和ACK标志位均为1,将确认序号Ack设置为X+1,自己的序号Seq设置为Y
    • server当前状态:SYN-RCVD(同步收到)
    • client当前状态:ESTABLISHED(连接状态)
    • 该报文不携带数据,消耗一个序号
    1. 第三次握手:
    • client再次发送确认包,SYN标志位回置为0,ACK标志位为1,将确认序号Ack设置为Y+1
    • server当前状态:ESTABLISHED(连接状态)
    • client当前状态:ESTABLISHED(连接状态)
    • 该报文可携带数据,携带数据时需消耗一个序号

    TCP四次挥手

    四次挥手(four-way handshake),客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

    1. 第一次挥手:
    • 主动方发送FIN+ACK报文,FIN标志位为1,ACK标志位为1,Ack设置为Z,序号Seq为U
    • 主动方状态:FIN-WAIT-1(终止等待1)
    • 被动方状态:ESTABLISHED(连接状态)
    • 该报文即使不携带数据也要消耗一个序号
    1. 第二次挥手:
    • 被动方发出Ack报文,ACK=1,Ack设置为U+1,序号Seq=V
    • 被动方状态:CLOSE-WAIT(关闭等待)
    • 主动方状态:FIN-WAIT-2(终止等待2),此时主动方还需接收被动方发送的最后数据
    1. 第三次挥手:
    • 被动方最后的数据发送完成后,向主动方发送连接释放报文,FIN=1,Ack设置为U+1,序号Seq=W
    • 被动方状态:LAST-ACK(最后确认)
    • 主动方状态:FIN-WAIT-2(终止等待2)
    1. 第四次挥手:
    • 主动方发出ACK报文,ACK=1,Ack设置为W+1,序号为U+1
    • 主动方状态:TIME-WAIT(时间等待)
    • 被动方状态:CLOSED(关闭状态)

    注:若客户端为主动方发送完最后一个ACK报文后,TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后才进入CLOSED状态,而服务器在接到客户端的Ack报文后马上进入CLOSED状态

    三次握手和四次挥手完整示意图:


    三次握手四次挥手.jpg

    MSL(Maximum Segment Lifetime)最长报文段寿命,TCP允许不同的实现可以设置不同的MSL值

    1)确保客户端发出的最后一个ACK报文能够传达到服务器,防止丢失
    2)防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中

    为什么建立连接是三次握手,关闭连接确是四次挥手呢?

    服务器收到客户端的断开连接的FIN+ACK时,仅表示客户端不再发送数据,但还能接受数据,所以服务器在进行回发确认ACK报文后,还可以传输一些剩余数据,传输完成后再发送FIN报文,表示数据传输完了,连接可以关闭了,因此是四次挥手

    建立连接后客户端故障怎么办

    TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

    相关文章

      网友评论

          本文标题:TCP协议基础知识

          本文链接:https://www.haomeiwen.com/subject/ribibftx.html