首页 > 其他分享 >TCP的三次握手

TCP的三次握手

时间:2022-11-21 10:56:09浏览次数:52  
标签:握手 SYN TCP 连接 三次 报文 服务端 客户端

1、概述

TCP三次握手是浏览器和服务器建立连接的方式,目的是为了使二者能够建立连接,便于后续的数据交互传输。

第一次握手:浏览器向服务器发起建立连接的请求。

第二次握手:服务器告诉浏览器,我同意你的连接请求,同时我也向你发起建立连接的请求。

第三次握手:浏览器也告诉服务器,我同意建立连接。

至此,双方都知道对方同意建立连接,并准备好了进行数据传输。


2、具体过程

image

参数说明

SYN:

  • TCP报文中的标志位字段之一。
  • 在建立连接时使用,用来同步序号。
    • 当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段。
    • 当 SYN=1,ACK=1 时,表示对方同意建立连接。
    • SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。

ACK:

  • TCP报文中的标志位字段之一。

  • 表示前面的确认号字段是否有效,ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。

  • TCP 规定,连接建立后,ACK 必须为 1。

seq:

  • TCP报文中的序列号字段。
  • 占32位(bit),表示本报文段所发送数据的第一个字节的编号。在TCP连接中,所传送的字节流的每一个字节都会按顺序编号。

ack:

  • TCP报文中的确认号字段。
  • 占32位(bit),表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。

0、初始状态

服务端监听某个端口,处于 LISTEN 状态。


1、客户端发送TCP连接请求

客户端会随机一个初始序列号seq=x(client_isn),设置SYN=1 ,表示这是SYN握手报文。

然后就可以把这个 SYN 报文发送给服务端了,表示向服务端发起连接,之后客户端处于 同步已发送状态。


2、服务端发送针对TCP连接请求的确认

服务端收到客户端的 SYN 报文后,也随机一个初始序列号seq=y(server_isn)

设置ack=x+1,表示收到了客户端的x之前的数据,希望客户端下次发送的数据从x+1开始。

设置 SYN=1 和 ACK=1。表示这是一个SYN握手和ACK确认应答报文。

最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于同步已接收状态。


3、客户端发送确认的确认

客户端收到服务端报文后,还要向服务端回应最后一个应答报文。

将ACK置为 1 ,表示这是一个应答报文。

设置ack=y+1 ,表示收到了服务器的y之前的数据,希望服务器下次发送的数据从y+1开始。

最后把报文发送给服务端,这次报文可以携带数据,之后客户端处于 连接已建立 状态。

服务器收到客户端的应答报文后,也进入连接已建立状态。


3、为什么是三次握手?

3.1、主要原因是为了防止历史连接。

三次握手的时候,如果网络拥堵,第一次握手的SYN包没能到达服务端,那么客户端就会连续发送多次SYN建立连接的报文,那就有可能出现一个【后发送的SYN报文】比一个【早发送的SYN报文】早到达服务端。

那么此时服务端就会回一个 SYN + ACK 报文给客户端;

  • 如果是两次握手连接,就不能判断当前的链接是否是历史连接,导致错误。
  • 如果是三次握手连接,客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送 RST 报文给服务端,中止这一次连接。

3.2、三次握手可以避免资源浪费

如果只有两次握手,当客户端的 SYN 请求连接在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN。

如果是三次握手,第三次握手时服务器可以得到客户端的ack,知道连接已成功建立。

如果没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的 ACK 确认信号,所以每收到一个 SYN 就只能先主动建立一个连接。

如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。


学习参考:

标签:握手,SYN,TCP,连接,三次,报文,服务端,客户端
From: https://www.cnblogs.com/luckest/p/16910683.html

相关文章

  • kubectl进程启动失败"Streaming server stopped unexpectedly" err="listen tcp [::1]
    使用systemctlstartkubelet启动发现没有报错,使用journalctl-xefukubelet查看报错如下"Streamingserverstoppedunexpectedly"err="listentcp[::1]:0:bind:can......
  • TCP报文格式详解
    TCP报文格式TCP头部固定首部部分一共20个字节,在图中分为五行,每行四个字节,也就是32位。长度不定的可选字段可选字段的长度不定,意味着TCP头部的长度是可变的。......
  • tcpdump抓取CoAP数据包,WireShark解析
    考虑这样的场景,设备使用NB-IoT发送CoAP数据包到服务器,服务器是Linux,作为服务器的Linux通常只有命令行。在这样的场景下想要捕获CoAP数据包进行分析。首先在设备端捕获是不现......
  • tcp的拥塞控制算法reno与bbr
    拥塞的指证超时---拥塞收到三个冗余的ACK---轻微拥塞发送方如何控制向网络中发送的速率发送方在对方未经确认的情况下,可以向网络中发送多少字节:min(发送方拥塞窗......
  • TCP报文及状态分析
    0.背景传输控制协议TCP(TransmissionControlProtocol)TCP和UDP协议的区别以及原理简单总结下,TCP就是个位于传输层(四层)的面向连接的端对端可靠传输的全双工通讯协议如何保......
  • 理解TCP/IP、HTTP、FTP、 NTP、 SNMP、VRRP等常用协议(VRRP)
    VRRP(VirtualRouterRedundancyProtocol)------虚拟路由器冗余协议,其最新技术标准是RFC3768。1  概述1.1  产生背景随着​​Internet​​​的发展,人们对网络可靠性的要......
  • tcp/ip名词解析
    互联网协议(InternetProtocolSuite)是一个网络通信模型,以及一整个​​网络传输协议​​​家族,为​​互联网​​的基础通信架构。它常被通称为TCP/IP协议族(英语:TCP/IPProtoc......
  • 理解TCP/IP、HTTP、FTP、 NTP、 SNMP、VRRP等常用协议(FTP)
    FTP概述文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。在传输文件时,FTP客户端程序先与......
  • 理解TCP/IP、HTTP、FTP、 NTP、 SNMP、VRRP等常用协议(SNMP)
    一、首先我首先要说下什么是SNMP?简单网络管理协议(SNMP,SimpleNetworkManagementProtocol),由一组网络管理的标准组成,包含一个​​应用层​​​协议(applicationlayerprotoc......
  • TCP与UDP协议
    TCP与UDP都是基于传输层的TCP是基于连接的UDP是基于非连接的 TCP的三次握手是建立连接的过程全双工 为什么要建立三次连接,而不是两次连接,因为在客户端请求连接......