TCP协议

作者: hekirakuno | 来源:发表于2019-10-06 12:57 被阅读0次

    首先我们来了解一下什么的TCP协议和IP协议。

    IP协议是什么?
    IP协议是无连接的通信协议,用于计算机之间的通信,但是它不会占用两个正在通信的计算机之间的通信线路。这样,IP就降低了对网络线路的需求。每条线可以同时满足许多不同计算机之间的通信需求。通过IP,消息被分割(由TCP来分割)成小的独立包,并通过因特网在计算机之间传送。当一个IP包从一台计算机被发送的时候,它会被送到一个IP路由器,然后路由器通过通信量,网络中的错误或者其他参数来进行正确的寻址从而准确地将这个IP包直接地或者通过其他路由器路由至目的地。IP负责将每个包路由至目的地,但是IP协议没有做任何保障数据按顺序完整传输的控制,所以IP数据包是不可靠的,所以TCP协议便做出了控制。

    TCP协议是什么?
    TCP协议是一种面向连接的,可靠的,基于字节流的传输控制协议,用于应用程序之间的通信。数据传输时,应用层向TCP发送数据流,TCP将其分割成适当长度的报文段,报文段的长度由该计算机连接的网络的数据链路层的最大传输单元(PMTU)限制,最后TCP把结果包传给IP层,由它将包传送给目标节点的TCP层,TCP为了保障不丢失包,会给每个包一个序号seq,同时,序号也保障了到达目标节点之后的按序处理。TCP对于已经成功接收到的包返回一个已成功的确认ack,如果一定时间内没有收到确认,则认为丢失,并重新发送该包(三次握手)。在双方经过“三次握手”之后,TCP将在两个应用程序之间建立一条全双工(full-duplex)的通信,这个全双工的通信将占用两个计算机的通信线路,直到它被一方或者双方关闭为止。


    TCP报文格式
    TCP不包含IP地址信息(网络层处理),但是会有目的端口和源端口(端口属于传输层)。我们知道两个进程需要通信可以有管道,内存共享,信号量,消息队列等方法,最基本的要求是要能够唯一标识一个进程,通过这个唯一标识找到对应的进程。在本地进程中,我们可以使用PID做唯一标识。但是如果是不同计算机之间的通信,PID就不管用了,所以需要使用TCP协议+端口号(唯一标识进程)+IP地址(唯一标识主机),我们将这种唯一标识的方式称作“套接字”。

    序号:如果上一个发送的数据段包的序号是107,发送了100个字节,那么下一次发送的序号就会是207开始。
    确认序号:期望收到的下一个数据段包的序号,如果说B收到了A发送的(序号为301,长度为200字节的数据段包)所以说明B收到了来自A的从301到500(301+200-1=500)的数据,所以B期望收到的下一个A的报文的序号是501,于是就会回复一个ack为501的报文段。

    TCP报文格式

    TCP flags
    URG:紧急指针有效
    ACK:确认号有效
    PSH:不要缓冲,迅速处理
    RST:重置,或拒绝连接请求
    SYN:用于建立连接过程
    FIN:结束一次连接

    窗口
    用来表示想收到的每个TCP数据段的大小。用于接受方通知发送方自己还有多少缓冲区可以接收数据,然后发送方根据接收方的处理能力来发送数据,如此就不会导致接收方处理不过来发送的数据。窗口大小是一个16字节字段,因而窗口大小最大为65535字节。

    校验和
    [不太了解]

    紧急指针
    [紧急数据的大小]


    TCP的三次握手
    0、首先服务器监听是否有连接;
    1、建立连接时,客户端发送SYN包(seq=J)到服务器,并进入到SYN-SEND状态,等待服务器确认;
    2、服务器收到SYN包,必须确认客户的SYN(ack=J+1),同时自己也发送一个SYN包(seq=K),即SYN+ACK包,此时服务器进入SYN-RECV状态;
    3、客户端收到服务器的SYN+ACK包,向服务器发送确认报文ACK(ack=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。

    三次握手

    抓包测试
    注意看红框内的三条信息。
    源ip :192.168.1.184
    目标ip :115.28.159.6

    源端口:55994
    目标端口:80

    第一次:[SYN]seq=0
    第二次:[SYN,ACK]seq=0 ack=1
    第三次:[ACK]seq=1 ack=1

    抓包测试

    SYN攻击
    简单来说,就是使用假的ip,不断地向服务端发送大量的[SYN]请求,服务端返回[SYN,ACK]包之后就一直等待应答,造成长时间的半连接队列满,正常的[SYN]请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪,是一种DDOS攻击。


    四次挥手
    0、首先客户端想要终止连接,发送一个FIN包(seq=u),进入FIN_WAIT状态;
    1、服务端回应一个ACK包(ack=u+1)但是还未要中断连接,还会继续发送数据,进入CLOSE_WAIT状态;
    2、服务端要中断连接了,发送一个FIN包(seq=w,ack=u+1),进入LAST_ACK状态;
    3、客户端响应一个ACK包(seq=u+1,ack=w+1),两端进入CLOSED状态。

    四次挥手

    服务端出现大量CLOSE_WAIT的情况
    CLOSE_WAIT是因为服务端没有中断连接造成的。
    所以需要检查对方关闭连接后,我方是否有正确地关闭连接。

    在linux服务器查看各状态连接数的命令

    RTT和RTO
    RTT:发送一个数据包,到收到ACK回应的时间;
    RTO:重传时间间隔。(没有收到ACK会通过RTO设置的定时器让其重传)

    滑动窗口
    滑动窗口提供TCP的可靠性和流控特性。

    发送端程序(从左向右):
    最后一次确认的位置,最后一次发送的位置,最后一次写入的位置。
    接收端程序(从左向右):
    最后一次读取的位置,下一次期望处理的位置,最后一次收到的位置。

    接收端滑动窗口大小:接收端缓冲区大小-(最后一次收到的位置-最后一次读取的位置)
    发送端还可以发送数据的大小:滑动窗口大小-(最后一次发送的位置-最后一次确认的位置)


    滑动窗口计算过程

    下面两张图对照着一起看,会比较明确。


    发送端滑动窗口
    接收端滑动窗口

    UDP协议
    稍微了解一下UDP吧。
    UDP是一个面向非连接的协议,不维护连接状态,可以同时向多个客户端发送相同的消息;报头很短;不保证可靠交付;不拆分数据。

    参考资料:
    TCP协议详解
    慕课网

    相关文章

      网友评论

          本文标题:TCP协议

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