博客内容:TCP/UDP
文章目录
- 一、TCP与UDP
- 二、tcp可靠性如何保证?
- 1、三次握手
- 2、TCP报头
- 3、TCP四次挥手
一、TCP与UDP
tcp与udp都是传输层的协议,用于数据的传输。
对于tcp而言数据的传输会比较可靠,主要依赖于tcp面向链接的,采用“字节流”,同时会对于数据顺序排序,以及数据的流量控制,重发机制等来保障。
udp是无连接的一种协议,数据报的传输就得不到保证,但是不需要进行链接就意味着数据的传输速度方面就比tcp快。通过对比会发现俩者都是进行一个“互补”。适用的场景不同对于tcp要求可靠,有序、传输量大的应用,比如文件传输,云端备份。udp就适合对于实时要求高的,传输速度快,数据量小,可以容忍对于数据的丢失的,比较实用的就是网络游戏,视屏会议等。
二、tcp可靠性如何保证?
1、三次握手
对于tcp的三次握手来提高对于对于数据安全的链接
- 第一次握手:客户端向服务器发送SYN包,表示请求连接
- 第二次握手:服务器收到SYN包后,向客户端发送ACK包,表示确认收到请求,并发送自己的SYN包,表示同意连接
- 第三次握手:客户端收到服务器的SYN包后,向服务器发送ACK包,表示确认收到同意连接的消息
这样,服务器收到ACK包后,TCP连接就建立成功了。
客服端发起请求给服务器,服务器收到请求并作出响应。进行数据应答时带上自己的请求,这样的恢复恢复方式叫做捎带应答
。
这样建立的链接就可以进行数据的传输了,在数据传输的过程中对于发送和接受双方都需要对于数据进行处理。但是对于数据的接受都是有一定大小的不然就会出现你这边已经说的天花乱坠、口干舌燥。然后别人就会给你一个反馈一脸懵。为了防止这样的情况发生就会在双方交流前就说好,我能接受的范围的一个缓冲区MMS
的最小值。
如何保证对方接受的消息就是当前需要发送给他的,他回复的应答如何是对于那一句的回复。换句话说就是避免俩个人在进行“交流”时,出现牛头不对马嘴的情况。
- 顺序控制
这就是对于消息一个处理,对于数据段中的每一个字节都进行一个编号(序列号),这样就行数据发送时只需要进行对数字的一个确认尽可以了。在范围内进行最后一个数字和消息最后一个编号对应就可以。回答时只需要最后一个编号就可以了。如果在一段时间内没有得到消息回复,无法判断是否收到数据。就会认为是数据包丢失或损坏:如果发送方在规定的时间内(计时器超时时间)没有收到接收方的确认消息,就会认为该数据包已经丢失或损坏。这个时候就会一进行数据的重发来避免数据的丢失问题。就是重发机制。 - 流控制
流量控制是指TCP协议使用滑动窗口来控制数据发送的速率。TCP连接的两端会通过一个滑动窗口来控制每个数据包的大小和发送速率。发送方根据接收方发送的确认信息动态调节发送窗口的大小,以限制发送数据的速率,避免网络拥堵和丢包。
实际上,TCP的流量控制使用了两个窗口:拥塞窗口和接收窗口。拥塞窗口用于限制整个网络的拥塞情况,而接收窗口用于限制接收方的接收能力。TCP发送方的拥塞窗口大小由网络拥塞程度决定,而接收方的窗口大小由接收方的接收能力决定。
当发送方向接收方发送数据时,接收方会返回一个ACK确认信息,确认接收的数据量,并通知发送方自己的接收窗口大小。发送方会根据这个窗口大小来动态调整自己的发送速率,以避免发送方发送过多数据导致网络拥堵和丢包。
2、TCP报头
看完tcp的报头就会理解tcp的可靠性了。
TCP头部共有20个字节,包含以下字段:
字段名称 | 字节数 | 描述 |
---|---|---|
源端口号 | 2 | 源端口号,标识发送端口 |
目标端口号 | 2 | 目标端口号,标识接收端口 |
序列号 | 4 | 本次传输数据的第一个字节在数据流中的序号 |
确认号 | 4 | 确认号为期望收到的下一个数据包序号,即确认接收方已经收到了序列号到确认号之间的字节 |
数据偏移 | 4 bits | 表示TCP头部的长度,单位为4字节,所以该字段的值为TCP头部长度/4,取值范围为0~15 |
保留 | 6 bits | 保留字段,保留以后用 |
控制位 | 6 bits | 包括URG、ACK、PSH、RST、SYN、FIN六个标志位,用于控制TCP连接的建立、维护和结束 |
窗口大小 | 2 | 接收窗口大小,表示接收方当前还能接收多少数据 |
校验和 | 2 | TCP头部和数据的校验和 |
紧急指针 | 2 | 表示紧急数据在当前数据流中的位置 |
选项 | 可变 | TCP头部的可选项,包括最大段大小、时间戳、SACK等 |
数据偏移的取值范围是[0,60]字节,对于整个报头是20
字节。所以选项的大小就是:偏移*4-20=选项的大小。
3、TCP四次挥手
TCP四次挥手是指TCP连接的终止过程,
-
主动关闭方发送终止连接请求,即FIN报文段,进入FIN_WAIT_1状态。
-
被动关闭方收到FIN报文段后发送确认报文段ACK,进入CLOSE_WAIT状态。
-
被动关闭方关闭连接时,发送FIN报文段,进入LAST_ACK状态。
-
主动关闭方收到FIN报文段后发送确认报文段ACK,进入TIME_WAIT状态。在等待2倍的最大段生存时间(2MSL)后,进入CLOSED状态。
通过这四个步骤,TCP连接正常地终止。值得注意的是,第三步和第四步可以合并成一步,即被动关闭方发送完FIN报文段后直接关闭连接,但是主动关闭方需要在收到ACK报文段后等待2MSL的时间才能关闭连接。这是为了防止ACK报文段在传输过程中丢失,导致主动关闭方无法正常收到确认信息。