热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

如何获取握手包_浅谈三次握手原则

在了解三次握手原则之前,我们先来了解一下UDP和TCP协议之间的关联和关系和区别;在网络数据传输协议中,可划分为三个层次,分
7380c097cfb588b504dc040c22574e38.png

在了解三次握手原则之前,我们先来了解一下UDP和TCP协议之间的关联和关系和区别;

在网络数据传输协议中,可划分为三个层次,分别是:网络层、传输层、应用层。

在传输层中,就有TCP和UDP协议,而HTTP则位于应用层,除此之外,应用层还有FTP、TELNET、SMTP、DNS等协议。

这三种协议在日常生活中的应用较为广泛,比如无线广播就是使用的UDP协议,其特点就是传输效率高,但是UDP协议传输数据不安全,容易出现数据丢失的问题并且没有重发机制。UDP不可靠,不保证消息送达。

而TCP协议相对于UDP而言就安全多了,TCP 可靠保证消息送达,有重发机制。TCP是面向连接的,也就是每次通信之前,都需要先建立好连接,然后再进行通信。

52d60fd5b1dd04d878b4f55b38cbe0c0.png

上面讲到,TCP是需要建立连接的,那么,这个连接是如何建立起来的呢?我们一起来看看。

TCP的连接是需要进行三次握手从而建立起连接的,那么,这个三次握手是如何建立的呢?为何必须是三次握手呢?

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

我们通过一组图来看一下TCP三次握手的过程:

392e655ca5a200256a4a922d02e1da40.png

如图所示,甲和乙两个人通过三次交流从而建立起连接。那么,可能就会有小伙伴会问了,从这里,好像也没有看出三次握手的特别性啊。我们接着往下面看。

首先,TCP建立连接前,需要先进行三次握手从而建立连接。为什么必须是三次握手呢,还是以上面的图为例;

假设,甲给乙发消息:你瞅啥

情况一:假如乙没有收到甲发送的消息,可能是由于网络原因之类的一些不确定因素导致数据传输失败,那么发送出去的消息乙并没有接收到。显而易见,连接建立失败了;

情况二:假如乙成功收到了甲发送过来的数据,然后也积极的给甲回复了一条信息:瞅你肿么啦; 这个时候,如果乙给甲发送数据的时候,由于一些不确定的因素,导致数据丢失,甲没有收到乙发送过来的消息,那么,本次连接还是建立失败了。

情况三:假如乙成功的收到了甲发送过来的数据,然后乙发送给甲的数据甲也成功的收到了。这个时候,甲再回一句:你再瞅试试; 这个时候,数据发送失败,乙没有收到甲的消息,此时,连接还是建立失败了。

所以必须先建立连接双方才能有效通信。那么,上面的例子,为什么当三次握手时数据丢失即连接失败呢?

我们一起来分析一下:

首先,甲给乙发消息,那么,甲如何能够得知自己的消息乙成功接收到了呢?这个时候,乙再给甲回一个消息,当甲成功收到消息时,这个时候甲就能够确定,首先,自己这边发送消息功能正常,并且接收消息功能正常,然后再再给乙回一个消息。

这个时候再来看看乙。首先,乙刚刚收到了甲发过来的:”你瞅啥”;乙这个时候能够确认自己的接收功能正常,然后乙给甲回了一个”瞅你肿么了”;但是乙并不能确定自己的发送功能是否正常,甲是否能够接收到自己发送的消息,所以,需要第三次握手,也就是甲给乙再回一句:”你再瞅试试”;当乙成功收到甲发送过来的消息时,这个时候,乙就能肯定,自己的发送功能和接收功能都是正常的。可以开始建立通信了。

是不是感觉有点神奇。

当甲和乙三次握手建立成功时,这个时候TCP连接就建立成功了,此时就建立起了一个连接。

而HTTP协议则是建立在TCP协议之上的,所以HTTP协议也是一种安全可靠的协议并且是一种无状态的协议。

关于HTTP协议,我会在后面的文章中陆续学习和记录。



推荐阅读
  • 本文深入探讨了网络编程中的基本概念,如指针、引用和可重入函数,并详细介绍了OSI七层模型和TCP/IP四层模型的功能与协议。同时,文章还对比了HTTP与HTTPS的区别,分析了HTTP请求报文的结构,讨论了TCP与UDP的主要差异,以及滑动窗口协议的工作原理。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 深入理解IIS:全面解析与应用
    本文详细介绍了IIS(Internet Information Services)的功能及其在不同Windows系统中的应用,探讨了IIS如何支持多种网络服务,如Web、FTP、NNTP和SMTP,并解释了其在现代网站开发和服务器管理中的重要性。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 本文深入探讨了计算机网络的基础概念和关键协议,帮助初学者掌握网络编程的必备知识。从网络结构到分层模型,再到传输层协议和IP地址分类,文章全面覆盖了网络编程的核心内容。 ... [详细]
  • TCP/IP基础知识详解
    本文详细介绍了TCP/IP协议的基本概念,包括网络层次模型、TCP三次握手过程、四次挥手过程以及TCP与UDP的比较。通过这些内容,读者可以更好地理解TCP/IP协议的工作原理。 ... [详细]
  • Linux环境下Redmine快速搭建指南
    本文将详细介绍如何在Linux操作系统中使用Bitnami Redmine安装包快速搭建Redmine项目管理平台,帮助读者轻松完成环境配置。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 转自:http:www.yybug.comread-htm-tid-15324.html为什么使用Twisted? 如果你并不准备使用Twisted,你可能有很多异议。为什么使用T ... [详细]
  • Linux环境下通过PHP SMTP发送邮件的配置指南
    本文详细介绍了如何在Linux系统中配置PHP通过SMTP发送邮件,包括防火墙设置、端口检查与释放、IPv6到IPv4的转换、DNS缓存刷新以及PHP相关配置等步骤。 ... [详细]
  • 使用亚马逊免费服务部署Discuz!论坛指南(第一部分)
    本文将指导您如何利用亚马逊AWS提供的12个月免费试用服务来部署Discuz!论坛。仅需一张信用卡即可轻松注册并开始使用。文章将详细介绍从账号注册到实例创建的具体步骤。 ... [详细]
author-avatar
LYJ189_163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有