美文网首页
什么是tcp/ip协议?TCP的三次握手指的是什么

什么是tcp/ip协议?TCP的三次握手指的是什么

作者: ElmVector | 来源:发表于2018-03-24 10:13 被阅读0次

    大家好,我是IT修真院,一枚正直纯洁善良的如刚入门的Java程序员,今天跟大家分享一下修真院官网JAVA任务二,深度思考中的知识点——什么是tcp/ip协议?TCP的三次握手指的是什么


    1. 知识背景

    TCP/IP协议是什么

    通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。
    TCP/IP协议族按照层次由上到下,层层包装。


    2. 知识剖析

    • IP 是无连接的通信协议,用于计算机之间的通信。

    通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。
    IP 负责将每个包路由至它的目的地。
    每个计算机必须有一个 IP 地址才能够连入因特网。
    每个 IP 包必须有一个地址才能够发送到另一台计算机。

    • TCP 用于应用程序之间的通信,使用固定的连接

    当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。
    在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。
    这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
    UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。

    • TCP/IP 意味着 TCP 和 IP 在一起协同工作。

    TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。
    IP 负责计算机之间的通信。
    TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。
    IP 负责将包发送至接受者。


    3. 常见问题

    • 如何建立TCP/IP连接

    • IP包如何路由至目标地址

    • 到达目标地址的IP包如何检验完整性

    • 如何拆除连接


    4. 解决方案

    建立TCP/IP的过程就是要讲的三次握手。
    即三次握手就是为了解决连接的问题
    建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。

    (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

    (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

    (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    IP包有固定的报文格式,报头有所需要参数
    如:源端口、目标端口、确认序号和标志域等。
    拆除连接的时候,双方都需要关闭通道
    即四次挥手


    5. 扩展思考

    • 当短时间大量不存在的IP不断发送SYN包会出现什么情况

    在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。

    Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。

    SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了

    • 为什么一定要三次握手

    当A想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B, 所以A在一段时间内没收到ACK后,再发送一个SYN,这次B顺利收到,接着A也收到ACK,这时A发送的第一个SYN终于到了B, 对于B来说这是一个新连接请求,然后B又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,A收到这个SYN的ACK后也并不会理会它, 而B却不知道,B会一直为这个连接维持着资源,造成资源的浪费。

    两次握手的问题在于服务器端不知道一个SYN是否是无效的,而三次握手机制因为客户端会给服务器回复第二次握手, 也意味着服务器会等待客户端的第三次握手,如果第三次握手迟迟不来,服务器便会认为这个SYN是无效的,释放相关资源。 但这时有个问题就是客户端完成第二次握手便认为连接已建立,而第三次握手可能在传输中丢失,服务端会认为连接是无效的, 这时如果Client端向Server写数据,Server端将以RST包响应,这时便感知到Server的错误。

    总之,三次握手可以保证任何一次握手的失败都是可感知的,不会浪费资源


    6. 参考文献

    https://www.jianshu.com/p/ef892323e68f
    http://blog.csdn.net/u013344815/article/details/72134950


    PPT
    视频


    今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

    技能树.IT修真院

    “我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

    这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~

    作者:闵仕宇

    不足之处,欢迎指正~

    相关文章

      网友评论

          本文标题:什么是tcp/ip协议?TCP的三次握手指的是什么

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