美文网首页
TCP三次握手

TCP三次握手

作者: 云鲸鱼rain | 来源:发表于2019-03-12 10:21 被阅读0次

    慕课网翔仔老师处学习做笔记+知乎大神处学习


    一、在记录TCP三次握手之前,先说一下基本前提知识。

    1. 什么是IP协议?
    无连接的通信协议,不会占用两个正在通信的计算机之间的通信线路。

    2. 那么通信线路的概念又是?
    每条线可以同时满足许多不同的计算机之间的通信需要,通过IP,消息,或者其他方式连接。数据会被分割为较小的独立的包,并通过Inter网在计算机之间传送。

    3. IP协议在通信中的作用?
    IP负责将每个包路由至它的目的地。但IP协议没有做任何事情来确认数据包是否按顺序发送,包是否被破坏。所以IP数据包是不可靠的。需要由它的上层协议来做出控制。


    说到这里,引出来TCP,TCP协议来控制保证数据包的完整性


    二、引出来TCP之后,还是先介绍下TCP。

    1. TCP(传输层)协议是怎么样的协议?
    面向连接的,可靠的,基于字节流的传输层通信协议。

    2. TCP在数据传输时的作用呢?
    数据传输时,应用层向TCP发送数据流,TCP把数据流分割成适当长度的报文段。报文段的长度受该计算机连接的网络的数据链路层的最大传输单元及MPU的限制,之后TCP把结果包传给IP层。由它通过网络将包传送给目标节点的TCP层。

    3. TCP对数据包的处理呢?
    TCP为了保证不丢失包,给每个包一个序号,即sequence number,同时序号也保证了传送到目标节点包的按序处理。然后接收端实体对以成功收到的包发回一个相应的确认。即ACK确认。如果发送端实体在合理的 往返时间内未收到确认,那么对应的数据包假设为已丢失,并且将会对其重传。

    4. 如何校验数据在传输过程是否有误呢?
    TCP用一个奇偶校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和。

    5. TCP特性
    a. TCP和UDP的数据包都是不包含IP地址信息的,那是IP层上的事。
    b. TCP和UDP都会有源端口(Source Port)和目的端口(Destination Port),端口是属于传输层支持范畴的。
    c. 两个进程在计算机内部通信可以有管道,内存共享,信号量,消息队列等方法进行通信。
    d. 在本地进程通信,可以通过PID,进程号来唯一标识一个进程。
    e. 在互联网中,IP地址+协议+端口号标识网络中的唯一进程。这种方式也叫做套接字socket。
    f. 在TCP握手之后,TCP会在两个应用之间建立一个全双工(两台计算机可以互发信息)的通信,将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。


    三、在最后说握手之前,说下握手过程中必要了解的TCP Flags。

    TCP Flags
    URG:紧急指针标志。1:有效。0:无效。
    ACK:确认序号标志。 1:确认号有效。0:报文中不含确认号信息。
    PSH:push标志。1:带有push标志的数据,指示接收方在接收到该报文段以后应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
    RST:重置连接标志。用于重置由于主机崩溃或其他原因,而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
    SYN:同步序号,用于建立连接过程。
    FIN:finish标志,用于释放连接。1:发送发已经没有数据发送了,即关闭本方数据流。


    “握手”是为了建立连接。那手是什么?是通信双方数据原点的序列号(Sequence number)!


    四、TCP三次握手过程。

    0.被动打开的服务器,TCP服务器进程先创建传输控制块TCB,时刻准备接收其他客户进程发送过来的连接请求,此时服务端进入了listen状态。
    1.TCP客户端进程创建传输控制块TCB,向服务器发出连接请求报文(SYN报文段,不能携带数据,消耗掉一个序号),之后客户端进入SYN-SENT同步已发送的状态。——第一次握手
    2.当服务器接收到请求报文之后,如果同意连接,则发出确认报文(不能携带数据,消耗掉一个序号)。之后服务端进入SYN-RCVD同步收到状态。——第二次握手
    3.TCP客户进程收到确认报文之后,还要向服务器给出一个确认报文(携带数据,如果不携带数据,就不会消耗序号)。客户端进入ESTAB-LISHED状态(已建立连接状态),当服务器收到客户端的确认后,也会进入到ESTAB-LISHED状态。此后双方开始通信。——第三次握手

    三次握手
    具体抓包演示
    五、为什么需要三次握手才能建立起连接?

    为了初始化Sequence number 的初始值,通信的双方要互相通知自己的初始化的Sequence number,这个号要作为以后数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输问题而乱序,即TCP会用这个序号来拼接数据。


    六、第三次握手时有个隐患

    当第二次握手成功之后,客户端没有给服务端发送ACK确认,那么服务端就会不断尝试,直到超时。在linux下默认为5次,每次间隔时间翻倍。等1秒发第一次,等2秒发第二次,等4秒第三次,等8秒发第四次,等16秒发第五次,等32秒如果还没有收到ACK确认,判定为超时,一共63秒。TCP断开连接。

    可能会使得服务器遭到SYN Flood 攻击的风险,恶意程序会给服务器发一个SYN报文,之后下线,攻击者可以把服务器的SYN连接的队列耗尽,让正常的连接请求不能处理。

    当SYN队列满了之后,TCP服务端进程会通过源地址端口和目标地址端口以及时间戳打造出一个特别的sequence number回发回去,简称syncookies。
    如果攻击者收到syncookies不会有响应,如果正常则客户端会回发SYN Cookie,服务端通过cookie直接建立连接。


    七、建立连接后,客户端出现故障怎么办?

    保活机制(有保活时间 keep live time)
    在这段时间内,连接处于非活动状态,开启保护功能的一端将向向对方发送一个保活探测报文,如果发送端没有收到响应报文,经过一个提前设置好的保活时间间隔,将继续发送保活探测报文,直到发送报文探测的次数达到保活探测数,这时对方主机将被确认为不可达,连接中断。

    相关文章

      网友评论

          本文标题:TCP三次握手

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