Sign in
Sign up
Explore
Enterprise
Education
Search
Help
Terms of use
About Us
Explore
Enterprise
Education
Gitee Premium
Gitee AI
AI teammates
Sign in
Sign up
Fetch the repository succeeded.
Donate
Please sign in before you donate.
Cancel
Sign in
Scan WeChat QR to Pay
Cancel
Complete
Prompt
Switch to Alipay.
OK
Cancel
Watch
Unwatch
Watching
Releases Only
Ignoring
23
Star
192
Fork
47
yanleweb
/
interview-question
Code
Issues
1091
Pull Requests
0
Wiki
Insights
Pipelines
Service
Quality Analysis
Jenkins for Gitee
Tencent CloudBase
Tencent Cloud Serverless
悬镜安全
Aliyun SAE
Codeblitz
SBOM
Don’t show this again
Update failed. Please try again later!
Remove this flag
Content Risk Flag
This task is identified by
as the content contains sensitive information such as code security bugs, privacy leaks, etc., so it is only accessible to contributors of this repository.
TCP 传输过程?
Backlog
#I6N4XA
yanleweb
owner
Opened this issue
2023-03-14 22:29
## 传输过程 TCP(传输控制协议)是一种面向连接的协议,它保证了数据的可靠传输。在 TCP 传输数据时,数据会被分割成一个个的数据包进行传输,具体传输过程如下: - **建立连接**:TCP 通过三次握手建立连接,即客户端向服务器发送 SYN(同步)数据包,服务器接收到 SYN 后回应一个 SYN-ACK(同步-确认)数据包,客户端再回应一个 ACK(确认)数据包,连接建立成功。 - **数据传输**:数据在应用层被拆分成数据段,在传输层被拆分成数据包(也称为报文段),每个数据包包含源端口号、目标端口号、序列号、确认号、标志位等信息。发送方发送数据包后,等待接收方回复确认信息,如果未收到确认信息,则进行重传,直到接收方成功接收数据包。 - **拥塞控制**:当网络拥塞时,TCP 会采取措施来减少数据的传输速率,如减小窗口大小、降低拥塞窗口等。 - **连接终止**:TCP 通过四次挥手来关闭连接,即客户端发送一个 FIN(终止)数据包,服务器回应一个 ACK 数据包表示接收到 FIN,然后服务器再发送一个 FIN 数据包,客户端回应一个 ACK 数据包表示接收到 FIN,连接关闭成功。 总的来说,**TCP 通过三次握手建立连接、数据分段传输、拥塞控制和四次挥手关闭连接来保证数据的可靠传输**。 ## 详细说一下 TCP 通过三次握手建立连接? TCP通过三次握手建立连接的过程如下: - **第一次握手**:客户端向服务端发送 `SYN`(同步)包,其中 `SYN=1,seq=x`,表示客户端希望与服务端建立连接,同时指定自己的初始序号为`x`。此时客户端处于 `SYN_SENT` 状态。 - **第二次握手**:服务端接收到 SYN 包后,向客户端发送 `SYN-ACK` 包,其中 SYN=1,`ACK=1,ack=x+1,seq=y`,表示服务端已经收到客户端的请求,同意建立连接,同时指定自己的初始序号为y,确认号为`x+1`。此时服务端处于 `SYN_RCVD` 状态。 - **第三次握手**:客户端收到 SYN-ACK 包后,向服务端发送 `ACK` 包,其中 `SYN=0,ACK=1,ack=y+1,seq=x+1`,表示客户端已经收到服务端的确认,连接建立成功。此时客户端处于 `ESTABLISHED` 状态,服务端也处于 `ESTABLISHED` 状态。 这样就完成了三次握手建立连接的过程。在这个过程中,客户端和服务端都可以向对方发送数据。 需要注意的是,如果客户端在等待服务端的 SYN-ACK 包时超时或未收到响应,会重新发送 SYN 包,直到建立连接或达到最大重试次数。同时,在建立连接后,每个数据包都会在传输时带有序号和确认号,以保证数据的可靠传输。 ## TCP数据分段传输的过程是怎么样的? - 应用层将需要传输的数据分成适当大小的数据段,每个数据段称为一个TCP数据包。 - TCP协议根据MSS(最大报文长度)将TCP数据包分割成更小的IP数据包,以适应底层网络的MTU(最大传输单元)。 - 在传输数据之前,TCP在每个数据包中添加一个包头(header),其中包含序列号(sequence number)和确认号 (acknowledgment number)等信息。 - 发送方将数据包发送到网络,并等待接收方的确认响应。如果发送方没有收到确认响应,它会重新发送数据包。 - 接收方收到数据包后,会对数据包进行确认,向发送方发送确认响应。如果接收方没有收到正确的数据包,它会要求发送方重发数据。 - 发送方收到确认响应后,会将下一个数据包发送到网络,并等待接收方的确认响应。如果发送方没有收到确认响应,它会重新发送数据包。 - 接收方根据收到的数据包的序列号和确认号,组装数据包,然后将数据包传递给上层应用程序。 TCP数据分段传输可以提高网络的可靠性和稳定性,**避免了数据包的丢失和重传,但是也会造成额外的网络开销。** ## TCP 是如何进行拥塞控制? TCP使用拥塞控制算法来避免网络中的拥塞现象,并在发生拥塞时减少发送数据的速率,从而避免网络拥塞的加剧。TCP的拥塞控制算法主要包括以下几个方面: - **慢启动(Slow Start)**:在TCP连接刚建立时,发送方限制了自己的初始发送窗口大小,从而避免发送过多的数据导致网络拥塞。发送方以指数级别的方式增加其发送窗口大小,直到达到一个阈值,然后就会进入拥塞避免状态。 - **拥塞避免(Congestion Avoidance)**:在拥塞避免状态下,TCP发送方每经过一轮的传输,就将其发送窗口大小增加一个MSS(最大报文段长度)的值。这样可以逐渐增加发送窗口大小,从而提高数据传输速率。 **拥塞检测(Congestion Detection)**:当TCP发送方收到一个超时重传的确认消息时,它就认为网络中出现了拥塞,并将其发送窗口大小减半,然后重新进入慢启动状态。 - **拥塞避免(Congestion Avoidance)**:当TCP发送方收到一个失序的确认消息时,它就知道它发送的某些数据包在网络中已经丢失了,此时就不必等到超时重传定时器时间到期,而是立即重传那些丢失的数据包。 - **快速恢复(Fast Recovery)**:在快速重传后,TCP发送方将进入快速恢复状态,其中发送方的发送窗口大小将设置为丢失数据包的数量加上MSS的值,从而避免了发送窗口大小的降低和慢启动状态的重新启动。 ## 四次挥手关闭连接流程如何? TCP 通过四次挥手来关闭连接,具体过程如下: - 客户端向服务端发送 FIN 报文,表示客户端不再发送数据。 - 服务端收到 FIN 报文后,向客户端发送 ACK 报文,表示收到了客户端的 FIN 报文。 - 服务端向客户端发送 FIN 报文,表示服务端不再发送数据。 - 客户端收到 FIN 报文后,向服务端发送 ACK 报文,表示收到了服务端的 FIN 报文。 图示如下: ``` 客户端 服务端 | | | FIN(seq=x) | |--------------------->| | ACK(seq=x+1,ack=y) | |<---------------------| | | | FIN(seq=y) | |<---------------------| | ACK(seq=y+1,ack=x+1)| |--------------------->| ``` 其中,`seq` 表示序号,`ack` 表示确认号。第一次握手中,客户端发送的序号 seq=x,表示客户端的数据流的第一个字节的序号。第二次握手中,服务端发送的确认号 ack=y,表示服务端期望下一个收到的字节的序号是 y。第三次握手中,服务端发送的序号 seq=y,表示服务端的数据流的第一个字节的序号。第四次握手中,客户端发送的确认号 ack=x+1,表示客户端期望下一个收到的字节的序号是 x+1。注意,在第四次握手中,客户端发送 ACK 报文后,不再发送数据,但服务端可能还有数据需要发送,因此服务端需要先发送 FIN 报文。 四次挥手的过程中,最后一个 ACK 报文可能会丢失,因此需要等待一段时间后才能确认连接已经关闭。这个等待时间称为 `TIME_WAIT` 状态,一般为 `2MSL`(Maximum Segment Lifetime,最长报文寿命)时间,即一个报文在网络中最长的生命周期,通常为 2 分钟。 值得注意的是,TCP 的四次挥手过程是可靠的,可以确保数据可靠传输。但由于四次挥手需要消耗额外的时间和网络资源,因此在某些情况下,**可以使用 TCP 的强制断开连接方式(RST),通过发送一个 RST 报文来立即中断连接**。但这种方式可能会导致数据的丢失和损坏,因此应该谨慎使用。
## 传输过程 TCP(传输控制协议)是一种面向连接的协议,它保证了数据的可靠传输。在 TCP 传输数据时,数据会被分割成一个个的数据包进行传输,具体传输过程如下: - **建立连接**:TCP 通过三次握手建立连接,即客户端向服务器发送 SYN(同步)数据包,服务器接收到 SYN 后回应一个 SYN-ACK(同步-确认)数据包,客户端再回应一个 ACK(确认)数据包,连接建立成功。 - **数据传输**:数据在应用层被拆分成数据段,在传输层被拆分成数据包(也称为报文段),每个数据包包含源端口号、目标端口号、序列号、确认号、标志位等信息。发送方发送数据包后,等待接收方回复确认信息,如果未收到确认信息,则进行重传,直到接收方成功接收数据包。 - **拥塞控制**:当网络拥塞时,TCP 会采取措施来减少数据的传输速率,如减小窗口大小、降低拥塞窗口等。 - **连接终止**:TCP 通过四次挥手来关闭连接,即客户端发送一个 FIN(终止)数据包,服务器回应一个 ACK 数据包表示接收到 FIN,然后服务器再发送一个 FIN 数据包,客户端回应一个 ACK 数据包表示接收到 FIN,连接关闭成功。 总的来说,**TCP 通过三次握手建立连接、数据分段传输、拥塞控制和四次挥手关闭连接来保证数据的可靠传输**。 ## 详细说一下 TCP 通过三次握手建立连接? TCP通过三次握手建立连接的过程如下: - **第一次握手**:客户端向服务端发送 `SYN`(同步)包,其中 `SYN=1,seq=x`,表示客户端希望与服务端建立连接,同时指定自己的初始序号为`x`。此时客户端处于 `SYN_SENT` 状态。 - **第二次握手**:服务端接收到 SYN 包后,向客户端发送 `SYN-ACK` 包,其中 SYN=1,`ACK=1,ack=x+1,seq=y`,表示服务端已经收到客户端的请求,同意建立连接,同时指定自己的初始序号为y,确认号为`x+1`。此时服务端处于 `SYN_RCVD` 状态。 - **第三次握手**:客户端收到 SYN-ACK 包后,向服务端发送 `ACK` 包,其中 `SYN=0,ACK=1,ack=y+1,seq=x+1`,表示客户端已经收到服务端的确认,连接建立成功。此时客户端处于 `ESTABLISHED` 状态,服务端也处于 `ESTABLISHED` 状态。 这样就完成了三次握手建立连接的过程。在这个过程中,客户端和服务端都可以向对方发送数据。 需要注意的是,如果客户端在等待服务端的 SYN-ACK 包时超时或未收到响应,会重新发送 SYN 包,直到建立连接或达到最大重试次数。同时,在建立连接后,每个数据包都会在传输时带有序号和确认号,以保证数据的可靠传输。 ## TCP数据分段传输的过程是怎么样的? - 应用层将需要传输的数据分成适当大小的数据段,每个数据段称为一个TCP数据包。 - TCP协议根据MSS(最大报文长度)将TCP数据包分割成更小的IP数据包,以适应底层网络的MTU(最大传输单元)。 - 在传输数据之前,TCP在每个数据包中添加一个包头(header),其中包含序列号(sequence number)和确认号 (acknowledgment number)等信息。 - 发送方将数据包发送到网络,并等待接收方的确认响应。如果发送方没有收到确认响应,它会重新发送数据包。 - 接收方收到数据包后,会对数据包进行确认,向发送方发送确认响应。如果接收方没有收到正确的数据包,它会要求发送方重发数据。 - 发送方收到确认响应后,会将下一个数据包发送到网络,并等待接收方的确认响应。如果发送方没有收到确认响应,它会重新发送数据包。 - 接收方根据收到的数据包的序列号和确认号,组装数据包,然后将数据包传递给上层应用程序。 TCP数据分段传输可以提高网络的可靠性和稳定性,**避免了数据包的丢失和重传,但是也会造成额外的网络开销。** ## TCP 是如何进行拥塞控制? TCP使用拥塞控制算法来避免网络中的拥塞现象,并在发生拥塞时减少发送数据的速率,从而避免网络拥塞的加剧。TCP的拥塞控制算法主要包括以下几个方面: - **慢启动(Slow Start)**:在TCP连接刚建立时,发送方限制了自己的初始发送窗口大小,从而避免发送过多的数据导致网络拥塞。发送方以指数级别的方式增加其发送窗口大小,直到达到一个阈值,然后就会进入拥塞避免状态。 - **拥塞避免(Congestion Avoidance)**:在拥塞避免状态下,TCP发送方每经过一轮的传输,就将其发送窗口大小增加一个MSS(最大报文段长度)的值。这样可以逐渐增加发送窗口大小,从而提高数据传输速率。 **拥塞检测(Congestion Detection)**:当TCP发送方收到一个超时重传的确认消息时,它就认为网络中出现了拥塞,并将其发送窗口大小减半,然后重新进入慢启动状态。 - **拥塞避免(Congestion Avoidance)**:当TCP发送方收到一个失序的确认消息时,它就知道它发送的某些数据包在网络中已经丢失了,此时就不必等到超时重传定时器时间到期,而是立即重传那些丢失的数据包。 - **快速恢复(Fast Recovery)**:在快速重传后,TCP发送方将进入快速恢复状态,其中发送方的发送窗口大小将设置为丢失数据包的数量加上MSS的值,从而避免了发送窗口大小的降低和慢启动状态的重新启动。 ## 四次挥手关闭连接流程如何? TCP 通过四次挥手来关闭连接,具体过程如下: - 客户端向服务端发送 FIN 报文,表示客户端不再发送数据。 - 服务端收到 FIN 报文后,向客户端发送 ACK 报文,表示收到了客户端的 FIN 报文。 - 服务端向客户端发送 FIN 报文,表示服务端不再发送数据。 - 客户端收到 FIN 报文后,向服务端发送 ACK 报文,表示收到了服务端的 FIN 报文。 图示如下: ``` 客户端 服务端 | | | FIN(seq=x) | |--------------------->| | ACK(seq=x+1,ack=y) | |<---------------------| | | | FIN(seq=y) | |<---------------------| | ACK(seq=y+1,ack=x+1)| |--------------------->| ``` 其中,`seq` 表示序号,`ack` 表示确认号。第一次握手中,客户端发送的序号 seq=x,表示客户端的数据流的第一个字节的序号。第二次握手中,服务端发送的确认号 ack=y,表示服务端期望下一个收到的字节的序号是 y。第三次握手中,服务端发送的序号 seq=y,表示服务端的数据流的第一个字节的序号。第四次握手中,客户端发送的确认号 ack=x+1,表示客户端期望下一个收到的字节的序号是 x+1。注意,在第四次握手中,客户端发送 ACK 报文后,不再发送数据,但服务端可能还有数据需要发送,因此服务端需要先发送 FIN 报文。 四次挥手的过程中,最后一个 ACK 报文可能会丢失,因此需要等待一段时间后才能确认连接已经关闭。这个等待时间称为 `TIME_WAIT` 状态,一般为 `2MSL`(Maximum Segment Lifetime,最长报文寿命)时间,即一个报文在网络中最长的生命周期,通常为 2 分钟。 值得注意的是,TCP 的四次挥手过程是可靠的,可以确保数据可靠传输。但由于四次挥手需要消耗额外的时间和网络资源,因此在某些情况下,**可以使用 TCP 的强制断开连接方式(RST),通过发送一个 RST 报文来立即中断连接**。但这种方式可能会导致数据的丢失和损坏,因此应该谨慎使用。
Comments (
0
)
Sign in
to comment
Status
Backlog
Backlog
Doing
Done
Closed
Assignees
Not set
Labels
网络
Not set
Label settings
Milestones
中
No related milestones
Pull Requests
None yet
None yet
Successfully merging a pull request will close this issue.
Branches
No related branch
Branches (1)
Tags (64)
master
0.0.76
0.0.75
0.0.74
0.0.73
0.0.72
0.0.71
0.0.70
0.0.69
0.0.68
0.0.67
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.57
0.0.56
0.0.55
0.0.54
0.0.53
0.0.52
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
Planed to start   -   Planed to end
-
Top level
Not Top
Top Level: High
Top Level: Medium
Top Level: Low
Priority
Not specified
Serious
Main
Secondary
Unimportant
参与者(1)
TypeScript
1
https://gitee.com/yanleweb/interview-question.git
git@gitee.com:yanleweb/interview-question.git
yanleweb
interview-question
interview-question
Going to Help Center
Search
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
Comment
Repository Report
Back to the top
Login prompt
This operation requires login to the code cloud account. Please log in before operating.
Go to login
No account. Register