TCP的三次握手和四次挥手

一、网络七层协议

OSI七层协议模型主要是:物理层(Physical)、数据链路层(Data Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)、应用层(Application)

(1)物理层

主要定义物理设备标准,如网线的接口类型、各种传输介质的传输速率等。主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是常说的数模与模数转换)。这一层的数据叫做比特(bit),主要设备:集线器

(2)数据链路层

主要将从物理层接收的数据进行MAC地址的封装与解封装。常把这一层叫做帧,主要设备:网卡,交换机

(3)网络层

选择合适的网间路由和交换结点,确保数据及时传送,将从下层接收到的数据进行P地址的封装与解封装。常把这一层数据叫做数据包,主要设备:路由器

(4)传输层

定义了一些传输数据的协议和端口,如TCP、UDP协议,主要将从下层接收的数据进行分段和传输,到达目的地址后再进行重组,以往把这一层数据叫做

TCP的应用:文件传输对数据完整性要求高,传输中如果丢失数据会导致整个文件损坏无法打开,所以传输层会针对文件传输类的工作,选用TCP协议

UDP的应用:语音视频通话属于实时采集的数据发送的并不是一个事先准备好的文件,所以没有文件完整性一说,而是采集多少数据就传输多少数据,这时传输层则会选择忽略完整性检查,但是速度更快延迟更小的UDP协议。

(5)表示层
主要是进行对接收数据进行解释、压缩与解压缩等,即把计算机能够识别的东西转化成人能够识别的东西(如图片、声音等)。理解:对APP数据进行编码

如:

用BMP或JPEG编码,来表示图片数据

用WAV或MP3编码,来表示声音数据

用WMV或AVI编码,来表示视频数据

(6)会话层

通过传输层建立数据传输通路。在系统之间发起会话或者接受会话请求(设备之间需要互相认识)

理解:建立两个APP之间的会话。

(7)应用层

主要是一些终端的应用,比如说浏览器、APP等可以看到的东西,也就是终端应用。

二、TCP和UDP

TCP——传输控制协议(Transmission Control Protocal):TCP是一种面向有连接的传输层协议,能够对自己提供的连接实施控制。适用于要求可靠传输的应用,例如文件传输、发送邮件、浏览网页。面向字节流,传输慢。

UDP——用户数据协议(User Data Protocol):UDP是一种面向无连接的传输层协议,不会对自己提供的连接实施控制。适用于实施应用,例如:IP电话、视频会议、直播等。以报文的方式传输,效率高。

二者的区别:

  • TCP是基于连接的;而UDP是基于非连接的
  • TCP传输数据稳定可靠,传递速度慢,适用于对网络通讯质量要求较高的场景,需要准确无误地传输给对方;UDP传输数据部稳定,容易丢包,但是传递速度快,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。
  • TCP传输不安全,容易受到DOS、DDOS、CC等攻击;UDP相对TCP安全一些,但是UDP也无法避免遭受攻击。
  • TCP是一对一连接;UDP是一对多或多对多连接

三、TCP通信的过程

三次握手建立连接、四次挥手断开连接。

(1)三次握手

  • 客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成值);
  • 服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由服务端随机生成的,并且SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接。
  • 客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复(SYN=1,ACK=y+1,seq=x+1)

(2)四次挥手

刚开始双发处于ESTABLISHED状态

  • 客户端发送断开TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成);此时客户端处于FIN_WAIT1状态。
  • 服务端会回复客户端发送的TCP断开请求报文,其中包含seq序列号,是由服务端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上+1进行回复,以便客户端在收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成)。此时服务端处于CLOSE_WAIT状态,客户端处于FIN_WAIT2状态
  • 服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到客户端的数据是否已经传输完毕,一旦确认传输数据完毕,服务端就会讲回复报文的FIN字段置为1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成)此时服务端处于LAST_ACK状态,客户端处于TIME_WAIT状态
  • 客户端收到服务端的TCP断开请求后,客户端发送回复服务端的断开请求,包含随机生成的seq序列号字段和ACK字段,ACK字段会在服务端的TCP断开的请求的seq基础上+1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)。此时客户端处于TIME_WAIT状态需要过了一定时间(2ML)之后客户端才变为CLOSE状态,以确保发送方的ACK可以到达接收方,防止已失效连接请求报文段出现在此连接中。至此TCP断开的4次挥手过程完毕。

等待计时器(TIME_WAIT)

MSL(Max Segment Lifetime):最长报文段寿命

等待计时器等待的时间为2MSL,MSL一般设置为2分钟。

在这段时间内如果客户端没有收到服务端的重发请求,那么表示ACK成功到达,挥手结束,否则客户端重发ACK。

 为什么需要等待2MSL?

如果不等待,客户端直接跑路,当服务端还有很多数据包要给客户端发且还在路上的时候,若客户端的端口此时刚好被新的应用占用,那么就接收到了无用数据包,造成数据混乱。所以,最保险的做法就是等服务端发来的数据都失效后再启动新的应用。

1、确保发送方发送的第四次挥手ACK报文可以到达接收方

在第四次挥手时,只要发送方发出了第四次挥手的报文之后,发送方就进入了等待状态,这时最后一个报文其实是没有确认的,这个等待计时器主要是为了确保发送方发送的第四次挥手ACK报文可以到达接收方

1MSL是报文在网络中最长可以存活的时间,在1MSL时间里,如果第四次挥手ACK报文没有到达服务端接收方会重新发送第三次挥手的报文给客户端,客户端收到之后,就知道之前第四次挥手的ACK报文丢失了,然后再次发送ACK报文。确保正确地结束这次连接

假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一旦这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

2、确保当前连接的所有报文都已过期,防止失效的连接请求报文段出现在本连接中

因为最后一个报文都已经等待2MSL时间,所以对于其他报文,肯定也超过2MSL的时间,都是过期的报文

为什么是等待2MSL而不是1MSL?

在第四次挥手时,发送方发送ACK报文,如果服务端等1MSL没有收到发送方的ACK报文,那么说明ACK报文丢失了,此时服务端会再次重新发送第三次挥手的报文给服务端。这样从发送方发送ACK报文同时发送方进入TIME_WAIT状态等待开始,相当于两次报文传输的过程,每一次都是1MSL,两次就是2MSL。所以是等待2MSL。

为什么是四次挥手而不是三次?

因为服务端在接收到FIN,往往不会立即返回FIN,必须等到服务端所有的报文都发送完毕了,才能发FIN。因此先发一个ACK(第二次挥手)表示已经收到客户端的FIN,延迟一段时间才发FIN。这就造成了四次挥手。

如果是三次挥手会有什么问题?

等于说服务端将第二次挥手和第三次挥手合并为一次挥手(把第二次挥手的数据放到第三次挥手时一起发送),这个时候长时间的延迟可能会导致客户端误以为FIN没有到达服务段,从而让客户端不断的重发FIN。

为什么是三次握手而不是两次?

如果没有第三次握手告诉服务端,客户端已经收到了服务端传输的数据的话,服务器端的端口就会一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。长此以往,这样的端口越来越多,就会造成服务器开销的浪费。

总结:如果没有第三次握手,由于第二次握手的过程中数据可能存在丢失问题,导致客户端没有收到,但是服务端以为客户端收到了,实际上客户端没有收到,因此客户端就在一直等服务器发送数据,如果超时,就重新发起新的三次握手连接请求。但是服务端在第二次握手完成后,即服务端发送完报文之后,它以为客户端能够接受到自己发送的报文,它以为它们之间已经建立了链接,所以就一直在等客户端发送数据,导致整个过程循环,由于客户端在不停的创建连接,服务端会一直打开新的端口,长此以往,这样的端口越来越多,造成服务端资源的浪费。

三次握手可以携带数据么?

第三次握手的时候,是可以携带数据的。但是第一次、第二次握手不可以携带数据。

举个例子,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,每次都在第一次握手中的SYN报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发SYN报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。

而对于第三次的话,此时客户端已经处于ESTABLISHED状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以携带数据是没问题的。

三、HTTPS

TCP是传输层协议,而HTTPS是应用层协议。HTTPS是要基于TCP连接基础上的。

HTTPS是一种安全协议,它将HTTP传输协议与SSL/TLS加密协议结合在一起,使用公钥和私钥实现数据加密和解密。HTTPS不仅保护了用户的隐私信息,还能防止网络攻击者篡改或窃取数据。

(1)加密传输:HTTPS通过SSL加密技术将通信数据加密,非法用户无法解密获取有用信息,保证了数据传输过程中的安全性

(2)证书验证:HTTPS要求网站拥有合法的SSL证书。浏览器会对证书进行验证,若网站有问题,则会出现”不受信任的证书“警告。这样可以保证用户通过HTTPS访问的网站都是可信的。

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用加密确保私密性,以实现客户端和服务端之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。

其实HTTPS在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

 1、证书验证阶段

(1)浏览器发起HTTPS请求

(2)服务端返回HTTPS证书

(3)客户端验证证书是否合法,如果不合法则提示告警

2、数据传递阶段

(1)当证书验证合法后,在本地生成随机数

(2)通过公钥加密随机数、并把加密后的随机数传输到服务端

(3)服务端通过私钥对随机数进行解密

(4)服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输

为什么数据传输是用对称加密?

首先,非对称加密的加解密效率是非常低的,而http的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受。

另外,在HTTPS的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以HTTPS中内容传输加密采取的是对称加密,而不是非对称加密。

为什么需要CA 认证机构颁发证书?

HTTP协议被认为不安全是因为传输过程中容易被监听者勾线监听、伪造服务器,而HTTPS协议主要解决的便是网络传输的安全性问题。首先我们假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的**中间人攻击**问题。

证书包含什么信息?

  • 颁发机构信息
  • 公钥
  • 公司信息
  • 域名
  • 有效期
  • 指纹
  • ...

浏览器如何验证证书的合法性?

浏览器发起HTTPS请求时,服务器会返回网站的SSL证书,浏览器需要对证书做以下验证:

(1)验证域名、有效期等信息是否正确。证书上都有包含这些信息,比较容易完成验证;

(2)判断证书来源是否合法。每份签发证书都可以根据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书可以对对应机构签发证书完成来源验证。

参考:HTTPS为什么安全_九城风雪的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9332.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mvc进阶(下)

Mvc进阶(下) 1.前言2.上次代码弊端1.利用xml建模反射优化1.XMl文件2.对xml建模 3.修改中央控制器 3.再优化1.先优化Action子控制器4.优化传值问题 4.总结 1.前言 虽然前面文章深入解析Java自定义MVC框架的原理与实现讲述了Mvc框架,但是那只能…

联邦聚合(FedAvg、FedProx、SCAFFOLD)

目录 联邦聚合算法对比(FedAvg、FedProx、SCAFFOLD) 解决问题 FedAvg FedProx SCAFFOLD 实验结果 联邦聚合算法对比(FedAvg、FedProx、SCAFFOLD) 论文链接: FedAvg:Communication-Efficient Learning of Deep Networks from Decentralized Data …

高级Android开发人员枯竭,在这个利润丰厚的领域如何蓬勃发展

为什么高级人才供不应求? 技术行业的发展速度非常快,新的技术和工具不断涌现,导致技能需求不断演变。这使得不断更新和学习变得至关重要。行业发展速度超过了教育和培训体系的能力跟进。传统教育往往滞后于最新的技术趋势和实践,…

FreeRTOS学习笔记—任务挂起和恢复

文章目录 一、任务挂起和恢复API函数1.1 vTaskSuspend()函数1.2 vTaskResume()函数1.3 xTaskResumeFromISR()函数 二、任务挂起和恢复2.1 任务1挂起解挂任务22.2 中断中解挂任务1 三、补充内容3.1 FreeRTOS数据类型3.2 中断优先级分组3.3 错误问题 一、任务挂起和恢复API函数 …

深入理解Go语言中的并发编程【27】【Goroutine的使用、定时器、select】

文章目录 Goroutine池worker pool(goroutine池) 定时器定时器 selectselect多路复用 Goroutine池 worker pool(goroutine池) 本质上是生产者消费者模型可以有效控制goroutine数量,防止暴涨需求: 计算一个…

瑞吉外卖-Day01

title: 瑞吉外卖-Day01 abbrlink: ‘0’ date: 2023-04-1 18:00:00 瑞吉外卖-Day01 课程内容 软件开发整体介绍 瑞吉外卖项目介绍 开发环境搭建 后台登录功能开发 后台退出功能开发 1. 软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流…

从小白到大神之路之学习运维第53天--------tomcat-web应用——————供开发的商城框架

第三阶段基础 时 间:2023年7月5日 参加人:全班人员 内 容: Tomcat应用服务 WEB服务 目录 实验环境:(四台服务器) 安装tomcat服务: NginxTomcat 负载均衡集群部署: 安装ng…

Python 利用深度学习识别空间推理验证码(一)

注意:本文会比较长,因为空间推理验证码本身比较复杂,我会详细的讲解,我是如何一步一步拆分空间推理的思想去实现的,另外,这里只介绍第一种思想来解决空间推理验证码,实际上,解决该验证码的方法也比较多,这第一种,我会讲解的比较简单,通俗易懂。 注意:下面数据集使用…

HttpRunner自动化之请求中带有 headers 的接口和发送POST请求

headers 可通过headers 添加头部信息,如下图 # 发送请求头headers的接口 - config:name: 百度接口用例base_url: https://www.baidu.com- test:name: 发送百度接口的头部信息request:url: /smethod: GETheaders:Accept: text/html,application/xhtmlxml,applicati…

gitHub

gitHub ** 创建一个仓库 git initgit add .git commit -m “first commit”git branch -M maingit remote add origin gitgithub.com:Dylanmenglliao/demo.gitgit push -u origin main ** 已存在仓库,建立关联 7. git remote add origin gitgithub.com:Dylanme…

遥感云大数据在灾害、水体与湿地领域典型案例及GPT模型

详情点击链接:遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型 第一:基础 一:平台及基础开发平台 GEE平台及典型应用案例; GEE开发环境及常用数据资源; ChatGPT、文心一言等GPT模型 JavaScript基础&am…

【Hello mysql】 数据库基础

Mysql专栏:Mysql 本篇博客简介:简单的介绍mysql相关的一些基础知识和在Linux环境下的安装 让大家对于mysql有一个初步的认知 数据库基础 数据库基础数据库定义数据库再理解软件角度文件角度总结 主流数据库mysql安装卸载不要的环境获取mysql官方yum源安装…