文章目录
TCP和UDP协议是TCP/IP协议的核心。 TCP 传输协议:TCP 协议是一TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用
—— 摘自《百度百科》
本文一共 6498 字,建议先点赞收藏进收藏夹里吃灰( b u s h i ),以便复习观看 \color{pink}{本文一共6498字,建议先点赞收藏进收藏夹里吃灰(bushi),以便复习观看} 本文一共6498字,建议先点赞收藏进收藏夹里吃灰(bushi),以便复习观看
01 | 📕 什么是 T C P ? \color{red}{什么是TCP?} 什么是TCP?📕
TCP,全称为传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。它用于在网络中的通信应用程序之间创建可靠的、端到端的数据传输连接。
特点
TCP协议的主要特点包括:
-
面向连接:在使用TCP进行通信前,需要先建立连接,客户端和服务器之间交换控制信息以确保两者都准备好了再发送数据。通过三次握手(SYN、SYN-ACK、ACK)来实现建立连接的过程。在通信完成后,还需要通过四次挥手(FIN、ACK-FIN、ACK、ACK-FIN)关闭连接。
-
可靠性:TCP在数据传输过程中能够保证数据的可靠性,它通过序列号、确认应答、重传机制等手段来避免数据传输中的错误和丢失,确保接收方收到的数据与发送方发送的数据一致。
-
基于字节流:TCP面向的是一系列的字节流而不是固定大小的数据块,因此它可以自动将应用程序传输的高层数据分割成大小合适的报文段,同时也可以对接收方接收到的报文段进行组装。
-
支持多路复用:通过端口号来标识进程或应用程序,TCP支持多路复用来实现在一个物理链路上同时传输多个应用程序的数据。
总之,TCP协议是一种可靠的传输层协议,适用于对数据传输可靠性要求较高的场景(如文件传输、电子邮件传输等)。
三次握手 && 四次挥手
利用TCP在源主机和目的主机之间建立和关闭连接操作时,均需要通过三次握手来确认建立和关闭是否成功。三次握手方式如图所示,它通过“序号/确认号”使得系统正常工作,从而使它们的序号达成同步。TCP建立连接的三次握手过程如下。
- 三次握手
-
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
-
第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
-
第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
-
四次挥手
中断连接端可以是客户端,也可以是服务器端
-
第一次次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
-
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
-
第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
-
第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手
超时重传
TCP的超时重传机制是指在传输数据过程中,如果发送方没有收到对端的确认消息,就会触发一个超时计时器。当这个计时器超过设定的时间阈值时,发送方就会重新发送之前未被确认的数据。以下是详细的步骤:
-
发送方将数据分成一个个的报文段,并发送给接收方。
-
接收方收到报文段后,会向发送方发送一个确认消息(ACK),表示已经成功接收到了该报文段。
-
如果发送方在一定时间内没有收到接收方的确认消息,就会触发一个计时器,等待一段时间(即超时时间)。
-
如果在超时时间内发送方收到了接收方的确认消息,则表明数据已经成功发送,发送方会关闭计时器并等待下一个数据包的发送。
-
如果超时计时器到期但是发送方还没有收到确认消息,则发送方会将未确认的数据再次发送给接收方。
-
如果发送方连续多次都没有收到确认消息,则会认为连接已经失效,并关闭连接。
需要注意的是,TCP的超时重传机制会增加网络延迟和带宽利用率。因此,TCP使用了一些优化策略,比如快速重传和拥塞控制,以减少重传的次数和减小网络拥塞的影响。
滑动窗口
TCP滑动窗口机制是一种流量控制机制,用于在数据传输期间动态调整发送方和接收方之间的数据流量。具体来说,它允许发送方在接收到确认确认(ACK)之前连续发送多个数据包,并根据接收方反馈的窗口大小信息调整其发送速率。
滑动窗口的大小由接收方设置,它指定了可以接受的未确认字节数的最大值。当发送方发送一个数据包时,它会将该数据包的序列号添加到滑动窗口中,并等待接收方发送确认消息。如果接收方成功接收到数据包并确认,发送方会将滑动窗口往前移动,允许发送更多数据包。如果发送方没有收到确认消息,它将重传该数据包,并等待一段时间再次发送。
滑动窗口机制还可以通过使用选择确认(selective acknowledgements)来进一步优化性能。选择确认允许接收方标记已成功接收的特定数据包,而不是只确认已接收所有数据包的最高序列号。这样,发送方可以避免重传所有数据包,从而节省网络带宽和延迟。
02 | 📙 什么是 U D P ? \color{orange}{什么是UDP?} 什么是UDP?📙
UDP,全称为用户数据报协议(User Datagram Protocol),是一种无连接的、不可靠的、基于数据报的传输层通信协议。它与TCP一样也是用于在网络中的通信应用程序之间进行数据传输的通信协议。
UDP协议的主要特点包括:
-
无连接:与TCP不同,UDP不需要像TCP那样建立和维护连接,发送端直接向目标地址发送数据报,而不管目的地是否准备好接收数据或者是否存在连通性问题。
-
不可靠:UDP并不强制要求数据传输的可靠性,因此会存在数据传输过程中的错误和丢失,接收方也无法确认是否成功接收到了数据。如果需要保证数据传输的可靠性,需要自行实现重传机制和数据校验等功能。
-
基于数据报:UDP使用数据报的形式进行通信,每个数据报都有自己的独立头部信息,包含源端口、目标端口等信息,这些信息被用于识别数据报彼此间的关系。由于不像TCP需要建立和维护连接,UDP的数据报可以随时被发送并独立到达目标地址,不受先后顺序和分组大小限制。
-
小巧、高效:UDP的头部开销较小,在数据传输效率方面表现优异,因此非常适合实时性要求高、数据量少、网络质量较差的场景,例如音频、视频等流媒体应用。
可以这样说,TCP有助于提供可靠性;而 UDP有助于提高传输的高速率性。例如,必须支持交互式会话的应用程序(如FTP等)往往使用TCP;而自己进行错误检测或不需要错误检测的应用程序(如 DNS、SNMP等)往往使用UDP。
UDP协议软件的主要作用是将UDP消息展示给应用层,它并不负责重新发送丢失的或出错的数据消息,不对接收到的无IP数据报重新排序,不消除重复的IP数据报,不对已收到的数据报进行确认,也不负责建立或终止连接。这些问题是由使用UDP进行通信的应用程序负责处理的。
TC虽然提供了一个可靠的数据传输服务,但它是以牺牲通信量来实现的。也就是说,为了完成同样一个任务,TCP需要更多的时间和通信量。这在网络不可靠的时候通过牺牲一些时间换来达到网络的可靠性是可行的,但在网络十分可靠的情况下,则可以采用UDP,通信量的浪费就会很小。
总之,UDP协议是一种简单、高效、灵活的传输层通信协议,适用于那些对数据传输可靠性要求不高但需要快速传输数据的场景下。
03 | 📗 T C P 和 U D P 的区别 \color{green}{TCP 和 UDP 的区别} TCP和UDP的区别📗
TCP和UDP是两种不同的传输层协议,它们在很多方面都有明显的差异:
-
连接方式:TCP是面向连接的,数据传输前需要先建立连接,而UDP则是无连接的,发送者直接将数据报发送到目标地址。
-
可靠性:TCP是一种可靠的传输协议,它通过序列号、确认应答、重传机制等方式来确保数据的可靠传输,而UDP是不可靠的传输协议,不能保证数据的完整性和可靠性。
-
数据包大小:TCP没有固定的数据包大小限制,可以根据实际网络情况调整,而UDP每个数据包大小通常受限于底层网络的MTU(最大传输单元)大小。
-
数据流方式:TCP以字节流方式进行通信,而UDP以报文流进行通信;
-
传输速度:TCP传输速度慢,UDP传输速度快;
-
头部开销:TCP头部有更多的字段来维护传输控制信息,因此头部开销相对较大;UDP头部则比TCP简洁,只需包含源端口、目标端口、长度和校验和这几个基本信息。
-
适用场景:由于TCP可靠性较高,适用于文件传输、电子邮件、Web浏览器页面传输等对数据传输可靠性要求较高的场景;而UDP则适用于实时性要求较高的场景,如语音视频流媒体等,因为它不需要进行连接状态维护和应用数据确认处理,能够更快速地传输数据。
用表格总结如下
TCP | UDP | |
---|---|---|
连接方式 | 面向连接 | 无连接 |
可靠性 | 可靠 | 不可靠 |
数据包 | 无固定大小限制 | 受限于MTU大小 |
数据流方式 | 字节流 | 报文流 |
传输速度 | 慢 | 快 |
头部开销 | 大 | 小 |
适用场景 | 文件传输、电子邮件等 | 语音视频流媒体等 |
总之,TCP和UDP各有优劣,并且适合不同的应用场景。在实际的网络应用中,根据需求和应用场景的具体情况来选择使用哪种协议才能达到最佳的效果。
04 | 📘 问题总结 \color{blue}{问题总结} 问题总结📘
-
为什么 T C P 要进行握手? \color{red}{为什么TCP要进行握手?} 为什么TCP要进行握手?
TCP进行握手的主要目的是确保通信双方都已准备好开始数据传输,并建立一个可靠的连接。在握手过程中,发送方和接收方会交换一些特定的信息以确认彼此的身份和通信参数,并协商如何实现数据传输和错误处理。通过这种方式,TCP握手可以避免数据包的丢失、重复、乱序等问题,从而提高通信的可靠性和稳定性。
-
为什么是三次握手而不是两次? \color{orange}{为什么是三次握手而不是两次?} 为什么是三次握手而不是两次?
TCP使用三次握手的原因是确保双方都已准备好通信并建立一个可靠的连接。在两次握手中,客户端可以向服务器发送请求,但无法确认服务器是否已准备好接受请求。如果服务器没有准备好接受请求,它可能会忽略该请求并不进行任何响应。这种情况下,连接并未建立,但客户端认为连接已建立,从而可能导致数据传输错误和不必要的网络负载。
通过三次握手,客户端和服务器都可以确认彼此的身份和通信参数,并且就连接建立达成共识。第一次握手由客户端发送 SYN 包到服务器,第二次握手由服务器发送 SYN-ACK 包到客户端,第三次握手由客户端发送 ACK 包到服务器,双方都确认了对方的接受能力,从而确保了连接的可靠性和稳定性。
-
为什么 T C P 第二次握手的 S Y N 和 A C K 要合并成一次? \color{yellow}{为什么 TCP 第二次握手的 SYN 和 ACK 要合并成一次?} 为什么TCP第二次握手的SYN和ACK要合并成一次?
TCP 第二次握手中的 SYN 和 ACK 被合并成一条消息是因为这两个标志位都需要在该消息中传递。将它们组合成一个单独的消息可以减少网络流量和延迟,并提高连接建立的速度。此外,将它们合并还有助于防止某些攻击,例如 SYN 攻击,因为攻击者无法发送只包含 SYN 的消息来耗尽服务器资源。
-
TCP三次握手过程,有什么状态,状态机如何变化?
TCP 三次握手是建立 TCP 连接的过程,其状态和状态机变化如下:
-
初始状态:客户端和服务器都处于 CLOSED 状态。
-
第一次握手(SYN_SENT):客户端向服务器发送 SYN 包,进入 SYN_SENT 状态。
-
第二次握手(SYN_RECEIVED):服务器收到 SYN 包后,向客户端发送 SYN-ACK 包确认,并进入 SYN_RECEIVED 状态。
-
第三次握手(ESTABLISHED):客户端收到服务器的 SYN-ACK 包后,向服务器发送 ACK 包确认,进入 ESTABLISHED 状态。服务器在收到 ACK 包后也进入 ESTABLISHED 状态。
-
连接关闭:连接关闭时,任何一方可以发起关闭连接的请求,发送 FIN 包,等待对方响应后进入 CLOSE_WAIT 状态。当另一方也发送了 FIN 包并得到确认后,进入 TIME_WAIT 状态,等待 2 倍的最长报文段寿命(MSL)后彻底关闭连接。
-
最终状态:完成连接关闭后,客户端和服务器都回到 CLOSED 状态。
注意:如果发生超时或者异常情况,连接可能会进入一些特殊状态,例如 SYN_SENT 超时后转移到 CLOSED 状态,或者 TIME_WAIT 超时后直接进入 CLOSED 状态。
-
-
S Y N F l o o d 的原理?有哪些防范的方法? \color{green}{SYN Flood 的原理?有哪些防范的方法?} SYNFlood的原理?有哪些防范的方法?
SYN Flood 是指攻击者向目标主机发送大量的 TCP SYN 报文,使其在三次握手的过程中占用大量资源,从而导致服务不可用。攻击者通常使用伪造的源 IP 地址,使得目标主机无法回复对应的 ACK 报文。
防范 SYN Flood 攻击的常用方法包括:
-
过滤掉源IP地址是非法或不存在的数据包。
-
增加系统的最大连接数,减少单一连接的占用资源,以及限制每个IP地址的连接数。
-
启用SYN cookie技术,让服务器记录下第一个SYN包的初始序列号(ISN),并将该 ISN 和其他标识信息进行哈希运算后生成一个cookie值返回给请求方,请求方必须在后续的ACK报文中携带该cookie才能建立连接。
-
使用专业的入侵检测和防御设备,如IPS/IDS等,对网络流量进行分析和筛选,及时发现和阻断异常流量。
-
对操作系统、网络设备和应用程序进行定期更新和升级,以修复已知漏洞和缺陷。
-
-
三次握手可以携带数据吗? \color{cyan}{三次握手可以携带数据吗?} 三次握手可以携带数据吗?
在TCP的三次握手中,SYN和ACK标志位用于建立连接。因此,在三次握手期间不会携带数据。一旦连接建立成功,发送方才可以开始传输数据
-
为什么是四次挥手而不是三次挥手? \color{purple}{为什么是四次挥手而不是三次挥手?} 为什么是四次挥手而不是三次挥手?
在TCP中,需要四次挥手才能完全关闭连接。这是因为TCP是面向连接的协议,保证数据传输的可靠性和顺序性。在关闭连接之前,接收方需要确认它已经接收到了发送方所有的数据,并且发送方也需要确认接收方已经成功关闭了连接。因此,在关闭连接时需要进行四次挥手。
具体来说,四次挥手的过程如下:
-
发送方发送一个FIN报文给接收方,请求关闭连接。
-
接收方收到FIN报文后,发送一个ACK报文确认接收到了FIN报文。
-
接收方发送一个FIN报文给发送方,请求关闭连接。
-
发送方收到FIN报文后,发送一个ACK报文给接收方,确认接收到了FIN报文。此时连接完全关闭。
通过四次挥手,可以确保所有的数据都被正确地传输,并且双方都知道连接已经关闭。
-