| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> TCP与UDP协议的区别,以及TCP的三次握手和四次挥手 -> 正文阅读 |
|
[网络协议]TCP与UDP协议的区别,以及TCP的三次握手和四次挥手 |
目录 一、TCP/IP网络模型计算机与网络设备之间要实现通信的话,就必须基于相同的规则,例如中国人和中国人说话用中文,外国人和外国人说话用英文,中国人和外国人说话就必须要有相同的规则,而这个规则就是“协议”; TCP/IP协议其实是一个协议集合,比如TCP、UDP、HTTP、IP、FTP等协议都属于TCP/IP协议; OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层;TCP/IP协议一般划分为四层:链路层、网络层、传输层、应用层 ? 通信的真正端点并不是主机而是主机中的进程,也就是说,端到端的通信是应用进程之间的通信 传输层主要就干一件事:建立端到端的连接 二、TCPTCP全称是传输控制协议(Transmission Control Protocol),是一种面向连接,可靠的,基于字节流的传输层协议 2.1 TCP的特点:
2.2 单播和全双工????????每条TCP传输连接只能有两个端点,只能进行点对点(一对一)的单播数据传输,以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务。 ????????TCP还是一个双向对称的全双工(full-duplex)协议,一个TCP连接存在双向的读写通道,可以使数据在两个方向上同时进行传送操作,在发送数据的同时也能够接收数据,两者同步进行,就像平时打电话一样,说话的同时也能够听到对方的声音。半双工指虽然数据可以在一个信号载体的两个方向上传输,但是不能同时传输,时间段内只有一个动作发生。单工就是说数据传输是单向的,通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输。 2.3TCP头部TCP首部的最小长度为20字节,最大为60字节,主要参数如下:
2.4 TCP三次握手?2.4.1 三次握手是建立连接的过程所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示: ????????最开始客户端和服务器都是出于closed状态客户端主动打开closed状态,?tcp服务端进程先创建传输控制块TCB,时刻准备接收客户端的连接请求,此时服务器进入Listen(监听)状态tcp客户进程也是先创建TCB传输控制块,然后主动向服务器发出链接请求报文。 ?简单的说,握手过程中主要使用了 TCP 的标志(flag)——SYN(synchronize) 和ACK(Acknowledgement)。发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN和ACK 标志的数据包以示传达确认信息。最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束。若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发送相同的数据包。 2.4.2?为什么是三次握手而不是两次? ? ?第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开多个无效连接。 ????????客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器。 ????????如果不进行三次握手,而是两次,那么在服务器收到并返回响应之后服务器就会打开连接,此时服务器的响应可能并没有即时送达客户端,导致客户端重发连接请求,导致服务器端收到两个连接。假设每次发送的数据一直在丢失,客户端一直SYN,服务器就会产生多个无效连接,占用资源,这个时候服务器可能会挂掉。这个现象就是我们听过的“SYN的洪水攻击”。 ????????如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
只是把SYN开启(将SYN置1)是不够的,报文里还有一个重要字段Sequence序号 PS:为什么还需要sequence序号呢? ????????因为应用程序(客户端)可能连续发送多个序号给服务器(服务端),这样服务器就起码有依据可以判断哪些是累赘信息,而且这个sequence序号是随机生成的,作为初始值来进行后续判断依据,这样就更加保证了通道的唯一性。
? ??????这样客户端在收到号码后-1就知道是不是自己发送的TCP报文了,最后客户端还需要确认,因为如果不确认的话(相当于两次握手),服务器不知道自己发送出去“确认同步”是否被接受。于是必须再发送一次TCP报文来使连接正式建立。
三次握手之后就建立了连接,这个时候可以发送HTTP请求了? 2.5?TCP四次挥手全双工TCP通信的每个方向上都有独立的SN(序号),在关闭时,每一个方向都必须单独关闭,这就是四次挥手!假设服务器内容响应完毕了,各自可能就会发起关闭连接的要求了,注意客户端和服务端都能主动发起关闭请求。 客户端接收到服务器端的 FIN 报文并发送确认报文后进入TIME_WAIT状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。最大段生存期,是指报文段在网络中生存的最大时间,超时会被抛弃。 为什么客户端最后要等待2*MSL时间呢? ????????保证客户端发送的最后一个ACK确认报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
因为在发送HTTP请求和响应的时候序号和确认号被不断递增,因此这里就不再用固定数字来表示序号和确认号了
虽然发送了TCP报文,但是此时的客户端并未正式关闭通道,因为服务端那边可能还有需要发送的数据,
? ? ? ? 其实中间的ACK和FIN + ACK两步就足以证明为什么要4次挥手,关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了,但对方还能接收数据,而己方也未必将全部数据都发送给对方了,所以己方收到这个FIN报文之后处于CLOSE-WAIT状态,此时还可以发送一些数据给对方,发送完毕之后再发送FIN报文给对方来表示同意现在关闭连接。 ????????而最后还需要客户端一次确认,也是因为需要保证客户端收到了在第二、三次挥手间传递的数据,以及表示收到服务器的FIN请求,完成挥手。 2.7?TCP滑动窗口和流量控制????????窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。 ????????发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。 ????????接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收 TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能再发送数据。 2.8??TCP拥塞控制
????????拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。 ?3. UDP协议UDP(User Datagram Protocol)协议全称是用户数据报协议,是无连接协议,也称透明协议,也位于传输层。常见的对讲机、视频会议、VNC等许多都是UDP协议传输 ?4?TCP和UDP协议的区别比如浏览网页,软件聊天,以及收看视频都是通过这两种协议来进行数据传输的 TCP和UDP都工作在传输层,它们的目标都是在程序之间传输数据 而数据可以是文本文件,可以是视频,可以是图片 对于tcp协议和udp协议来说都是一堆二进制数,并没有多大区别。那TCP和UDP之间的区别到底是什么? 最大的区别是一个基于连接(tcp),一个基于非连接(udp) 举个简单的例子:如果把人与人之间的通信比喻成进程与进程的通信, 我们基本有两种方式:第一种方式是写信,第二种是打电话 这两种方式的最大区别是什么:
但是写信(udp)存在以下未知数
而打电话(tcp)则不同
????????这一系列流程都能得到及时的反馈,并能确认对方准确的接收到 ????????TCP是如何保证以上过程的,有三个关键步骤:三次握手,传输确认,四次挥手 5 字节流和数据报的区别最简单的解释,TCP的字节流和UDP的数据报,最主要的区别是通信双方是否必须执行相同次数的读、写操作。 TCP实际上也是传输的报文段,这里的“字节流”方式指的是仅把传输中的报文看作是一个字节序列,在字节流服务中,用户进程在某一时刻可以读或写任意数量的字节。由于没有报文边界,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,可以类比“水流”,等流动的没有边界的事务,这就是字节流的由来! 因为TCP是面向连接的,并且只能是单播连接,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的,因此,知道保证数据是有序的到达就行了,至于读、写数据的次数,每次读写多少数据可以自己看着办。 另外,TCP有一个发送缓冲区和接收缓冲区,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送,如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。比如写100个字节数据时,可以调用一次write写100个字节,也可以调用100次write,每次写一个字节;读100个字节数据时,也完全不需要考虑写的时候是怎么写的,既可以一次read 100个字节,也可以一次read一个字节,重复100次。 UDP的数据报是网络传输的数据的基本单元,包含一个报头和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就是说发送端调用了几次write,接收端必须用相同次数的read读完。 因为UDP是面向无连接的协议,并且支持广播和多播模式也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据,接收端可以接收来自不同主机的消息。这时候,如果一次能读取超过一个报文的数据,则可能会读取到两个不同来源的混合消息,这样的数据是错误且没有意义的。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:31:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |