• TCP三次握手和四次挥手


    📝TCP什么是TCP?

    1、TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。
    2、TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)

    📝TCP三次握手发生在哪里?

    • 如果网络体系按照OSI模型划分为七层,三次握手发生在中间的传输层!

      起承上启下的作用,建立端到端的连接,如客户端–服务器端

    在这里插入图片描述

    • ip地址

      客户端和服务器端都有各自的IP地址

    客户端和服务器端虽然都有IP地址可以获得联系,但是客户端和服务器端都有各自的应用进程,而且都有可能进行TCP连接,像同时电脑同时用谷歌或者火狐登录B站,B站需要把内容分发给两个不同的应用进程
    
    • 1
    • 除了IP地址以外需要什么参数才能保证内容不会错发给应用进程呢?

      端口号

      访问b站时处理IP地址浏览器还会自动添加上端口号443-->https协议
      
      给火狐和谷歌分配不同端口号,像管道一样进行固定的传输
      
      • 1
      • 2
      • 3
    • 握手前的核心条件

      IP地址+端口号=套接字scoked
      
      • 1

    在这里插入图片描述

    📝TCP什么是三次握手?

    ​ 在网络数据传输中,传输层协议TCP(传输控制协议)是建立连接的可靠传输,TCP建立连接的过程,我们称为三次握手。

    • 举个栗子

    在这里插入图片描述

    • 流程
    1: 客户端发送SYN报文,将序号8633发送给服务器端
    
    	- 序号(Sequence number)随机生成,作为初始值进行后续判断依据,保证通道的唯一性,
    	- 如果没有初始序号就会出现,客户端发送两次请求,服务器懵逼,不知道服务器想要干嘛
    
    2: 服务端接受到信号,发送SYN和ACK报文 , 将序列号变为确认号8633+1和随机序号303发送给客户端
    
    	- 客户端接受到确认号-1,就知道是不是自己发送的报文了
    	- 如果这一步发送成千上百亿次攻击会这么样---->DDOS攻击了解一下
    
    3: 客户端接受到信号,发送ACK报文,将序号8633+1(对方的确认号+1)和确认号303+1(对方的序列号+1),发送到服务器端
    
    	- 必要的,因为客户端不发送这条信号,服务器就不知道自己发送的"确认同步"是否被接收
    	- 如果只有两次握手 这个时候客户端没有回应,这样会浪费服务端的资源
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    📝TCP的三次握手一定能保证传输可靠吗?不能

    三次握手比两次更可靠,但也不是完全可靠,而追加更多次握手也不能使连接更可靠了。因此选择了三次握手。
    世界上不存在完全可靠的通信协议。从通信时间成本空间成本以及可靠度来讲,选择了“三次握手”作为点对点通信的一般规则。
    
    • 1
    • 2

    小结:

    三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1是否成立,如果成立说明对方正确收到了自己的数据包。
    
    • 1

    📝TCP握手之后,下一步呢?分手吗?

    在这里插入图片描述

    📝什么是四次挥手?

    在网络数据传输中,传输层协议断开连接的过程我们称为四次挥手
    
    • 1
    • 再举个栗子

      在这里插入图片描述

    • 流程

    1:Clien发送FIN,将序列号和确认号发送给Server
    
    	- 用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
    
    2:Server收到FIN后,发送ACK,将序号和确认号发送给Client
    
    	- Server进入CLOSE_WAIT状态。
    
    3: Server发送FIN,将序列号和确认号发送给Client
    
    	-用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
    
    4:Client收到FIN后,将序列号和确认号发送给Server
    	- Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 过程描述
    客户端:“我要回家吃饭啦!”
    服务器端:“等下,饭快做好了。”
    服务器端:“饭做好了,快回来”
    客户端:“ok!马上开飞机回来”
    
    • 1
    • 2
    • 3
    • 4
    • 注意:
    如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器可能原地裂开。
    
    • 1

    📝为什么连接的时候是三次握手,关闭的时候却是四次握手?

    ①因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
    ②但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。
    ③只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
    
    • 1
    • 2
    • 3

    答的,SYN报文是用来同步的。
    ②但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。
    ③只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

    
    
    • 1
  • 相关阅读:
    ssm+教务信息管理 毕业设计-附源码161124
    第17章 触发器
    pytorch深度学习入门
    冒泡排序算法
    Linux的难题,终于有解了
    redis过期删除及内存淘汰策略
    《MongoDB入门教程》第03篇 MongoDB基本概念
    OpenGL_Learn15(投光物)
    13-Dubbo服务调用过程源码分析-服务消费方发送请求
    【uiautomation】获取微信好友名单,可指定标签 & 全部
  • 原文地址:https://blog.csdn.net/m0_47520320/article/details/126852186