TCP协议与UDP协议

news/2024/5/18 14:00:34 标签: tcp/ip, udp, 网络

1.TCP协议特点

1.1连接的建立与断开

        TCP协议提供的是:面向连接、可靠的、字节流服务。使用TCP协议通信的双发必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP连接是全双工的,双方的数据可以通过一个连接进行读写。完成数据交换之后,通信双方都必须断开连接以释放系统资源。

       三次握手发生在客服端执行connect()的时候,该方法返回成功,则说明三次握手已经建立。三次握手示例图如下:

四次挥手发生在客户端或服务器端执行close()关闭的时候,示例图如下:

 

SYN标志:请求建立一个连接,我们称携带SYN标志的TCP报文段为同步报文段。

ACK标志:表示确认号是否有效。我们称携带ACK标志的TCP报文段为确认报文段

FIN标志:表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。

思考题:

1.为什么是三次握手,可不可以是两次为什么?

三次握手的步骤:

第一次握手:客户端向服务器端发送 SYN和序列号(如seq=i)。

第二次握手:服务器端向客户端发送SYN和序列号(seq=j)和ACK确认号(i+1)。

第三次握手:客户端向服务器端发送ACK确认号(j+1)。

之所以是三次握手,是因为只有双方都收到自己的seq被对方确认,才会认为这条连接时可靠的。如果只是两次握手,那么至多只有连接发起方的起始序列号能被确认,另一方的序列号得不到确认。换句说,如果是两次握手建立连接,第二次握手时发送丢包,那么客户端就无法与服务器建立连接。

2.如果监听队列listen(sockfd,5)大小是5,是不是服务器只能连接五个客户端?

不是,虽然listen()监听队列大小是5,表示能存放已完成三次握手连接的长度是5,但是accept()会从监听队列中接收已完成三次握手的连接,所以监听队列大小是5,不代表服务器端只能连接五个客户端。

3.三次握手过程中客户端向服务器端发送的SYN和序列号是不是,调用send()发送过去的?

 不是,客户端代码中connect()开始三次握手,connect()结束三次握手完成,三次握手未完成客户端和服务器端连接还未完成,用户不能发数据,所以SYN和序列号不是用户发送的,是传输层协议发送的。

4.四次挥手可不可以是三次呢?

四次挥手的步骤:

(1).先调用close()的一端向另一端发送FIN和序列号

(2).另一端向先调用close()的一端发送ACK确认号进行确认

(3).另一端调用cloe()向先调用close()的一端发送FIN和序列号

(4).先调用close()的一端向另一端发送ACK确认号进行确认。

四次挥手可以是三次挥手,当先调用close()的一端向另一端发送FIN和序列号时,另一端也刚好close(),此时另一端会把FIN和序列号和确认号ACK一起发送给先调用close()的一端。此时就是三次挥手。

发送缓冲区和接收缓冲区

 5.三次握手时可能出现什么攻击

一、握手阶段消息丢失

二、握手阶段队列已满

1.2TCP状态转移

        TCP 连接的任意一端在任一时刻都处于某种状态,当前状态可以通过 netstat 命令查看,下图是 TCP 连接从建立到关闭整个过程中通信两端状态的变化。其中 CLOSED 是假想的起始点,并不是一个实际的状态。

 上图中TIME_WAIT状态一般是主动关闭的一端才会出现的状态。该状态出现后,会维持一端长为2MSL(Maximum Segment Life)的时间,才会完全关闭。MSL是TCP报文段在网络中的最大生存时间。

TIME_WAIT状态存在的原因有两点:

可靠的终止TCP连接。

保证让迟来的TCP报文有足够的时间被识别并丢弃。

        在Linux系统上,一个TCP端口不能被同时打开多次,(两次及以上)。当一个TCP连接处于TIME_WAIT状态时,我们将无法立即使用该连接占用着的端口来建立一个新的连接。

思考题:

同一个端口可不可以被一个TCP和一个UDP的应用程序同时使用?

可以,因为TCP和UDP是不同的协议。

1.3流式服务特点

        TCP字节流的特点,发送端执行的写操作次数和接收端的读操作次数之间没有任何数量关系,应用程序对数据的发送和接收是没有边界限制的。如下图:

思考问题:

什么是粘包,如何解决?

      tcp协议是面向连接的,客户端和服务器是连接的,所以不同的send()发送的数据在同一个发送缓冲区中,即发送方发送的若干包数据到接收方接收时粘成一包,从接受缓冲区来看后一包的数据紧接着前一包数据的尾。

        如理方法:发送端send()一个一个发送

1.4应答确认与超时重传

        TCP 发送的报文段是交给 IP 层传送的。但 IP 层只能提供尽最大努力的服务,也就是
说, TCP 下面的网络所提供的是不可靠的传输。因此, TCP 必须采用适当的措施才能使两个运输层之间的通信变得可靠。 TCP 的可靠传输是通过使用应答确认和超时重传来完成。
下图是通过 netstat 命令抓包看到的信息:

 下图是无差错时, 数据交互的流程: 发送端发送数据 m1 给接收端,接收端收到数据后
会给发送端一个确认信息,以表明数据已经被成功收到。在发送方未收到确认信息前, M1
应继续被保留,直到确认信息到达才能丢弃

 下图是出现差错时,数据交互的流程:

1.5滑动窗口

         TCP 协议是利用滑动窗口实现流量控制的。一般来说,我们总是希望数据传输得更快一些,不会一次只发一个字节。但是如果发送方把数据发得过快,接受方就可能来不及接收,这就会造成数据的丢失。 所谓流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。

        在 TCP 的报头中有一个字段叫做接收通告窗口,这个字段由接收端填充,是接收端告
诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力
来发送数据,而不会导致接收端处理不过来。所以发送端就会有一个发送窗口,这个发送窗
口的大小是由接收端填充的接收通告窗口的大小决定的,并且窗口的位置会随着发送端数剧的发送和接收到接收端对数据的确认而不断的向右滑动,将之称为滑动窗口。
发送方的滑动窗口示意图如下:

 当收到 36 的 ack,并发出 46-51 的字节后,窗口滑动的示意图如下:

1.6拥塞控制

         在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资
源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性
能就要变坏。这种情况就叫做拥塞。 所谓拥塞控制就是防止过多的数据注入到网络中,这样
可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,涉及到所有主机,
所有路由器,以及与降低网络传输性能有关的所有因素

几种拥塞控制的方法:
慢开始、拥塞避免、快速重传、快速恢复

慢开始、拥塞避免、快速恢复示意图:

 快速重传示意图:

2.UDP协议的特点

        UDP数据报服务的特点:发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报发送。接收端必须及时针对每一个UDP数据报执行读操作,否则就会丢包。并且,如果用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据会被截断。 

 


http://www.niftyadmin.cn/n/233912.html

相关文章

【笔记】总结学习HashMap和HashTable

HashMap 和 Hashtable 都用于以键和值的形式存储数据。两者都使用散列技术来存储唯一密钥。但是HashMap和Hashtable 类之间也是有许多区别。 1.HashMap是不同步的,即非线程安全;Hashtable是同步的,即线程安全。 HashMap部分源码: // get pub…

使用Superlink控制物联网网关远程调试PLC示例(PLC/HMI调试工具)

目录 1.Superlink工具使用说明 1.1软件安装 1.2账号登录 1.3设备查看 1.4菜单栏使用 2. Superlink网关远程调试网口/串口设备示例 2.1 远程调试西门子网口1200 PLC示例 2.2 远程调试欧姆龙232 PLC实串口通讯示例 3. 常见使用问题及技术支持 3.1 Superlink工具使用问题…

Linux实战学习

文章目录一、Linux权限信息权限控制信息chmodifconfigpingnmap netstatps killzip unzip常用快捷键二、搭建Java环境yumJDKTomcatMysql三、部署Web项目到服务器一、Linux权限信息 Linux中,拥有最大权限的账户为: root(超级管理员),而普通用户在很多地方…

Mysql 学习(五)InnDB 存储引擎-B+树索引的使用

基础知识 了解了表索引的底层是B树结构,我们也要学会如何将这个结构的优势发挥出来,我们先来回顾上一节的重点,也就是总结一下B树的特点索引对应的是一棵B树,而B树对应的很多层,每一层存储的数据对应的是下一层节点的…

Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable(续篇)

目录背景意外发现结论背景 上篇Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable,我把WebMvcConfig 代码加入项目后,会报冲突的问题。如下所示。 requestMappingHandlerMapping: defined by method ‘requestMappingHandlerM…

限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现

文章目录前言1、计数器(固定时间窗口)算法原理代码实现存在的问题2、滑动时间窗口算法原理代码实现存在的问题3、漏桶算法原理代码实现存在的问题4、令牌桶算法原理代码实现最后本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示…

借鉴《观沧海》作现代爱情诗一篇

《观星空》 浩瀚的星空,闪耀着无尽的光芒, 拥抱着几许的寂寥和宁静, 而你,如同在我心中灿然闪耀的繁星, 指引着我前行的方向。 天地万物,都有着各自的轨迹, 同样,我们也因着时空的巧…

ArduPilot Kakute F7 AIO DIYF450 without GPS配置

ArduPilot Kakute F7 AIO DIYF450 without GPS配置1. 源由2. 配置2.1 Kakute F7 AIO相关配置2.1.1 串口规划2.1.2 电传配置2.1.3 GPS配置2.1.4 CRSF接收机配置2.1.5 Compass配置2.1.6 电机配置2.1.7 TX12 遥控器配置3. 实测效果4. 参考资料1. 源由 鉴于GPS模块信号质量未达标&…