什么是 TCP ?
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。并且 TCP 报文是「有序的」,当「前一个」TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能扔给应用层去处理,同时对「重复」的 TCP 报文会自动丢弃
用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
所以我们可以知道,建立一个 TCP 连接是需要客户端与服务端达成上述三个信息的共识。
Socket:由 IP 地址和端口号组成
序列号:用来解决乱序问题等
窗口大小:用来做流量控制
TCP 头格式有哪些?
我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
控制位:
ACK:该位为
1
时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的SYN
包之外该位必须设置为1
。RST:该位为
1
时,表示 TCP 连接中出现异常必须强制断开连接。SYN:该位为
1
时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。FIN:该位为
1
时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN
位为 1 的 TCP 段
为什么需要 TCP 协议? TCP 工作在哪一层?
IP
层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。
如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP
协议来负责。
因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
详细来看
TCP(Transmission Control Protocol)即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议,以下是关于它的详细介绍:
主要特点
- 面向连接:在数据传输之前,需先通过三次握手建立连接,数据传输完成后,再通过四次挥手释放连接,确保数据传输的可靠性和顺序性123.
- 可靠性:通过序号、确认和重传机制来保证数据可靠传输。发送方发送数据后,接收方会发送确认消息,若发送方在一定时间内未收到确认消息,就会重传数据123.
- 流量控制:采用滑动窗口机制,发送方根据接收方的处理能力动态调整发送数据的速率,防止数据丢失或拥塞,确保接收方能够处理接收到的数据123.
- 拥塞控制:利用拥塞窗口和慢启动等机制,避免网络拥塞导致数据丢失和网络性能下降,以维护网络的稳定性123.
- 全双工通信:允许通信双方同时进行数据的发送和接收,提高了通信效率123.
- 面向字节流:将数据视为无结构的字节流进行传输,没有消息边界的概念,需要应用层协议来解决消息的边界问题123.
工作原理
- 三次握手建立连接45 :
- 第一次握手:客户端向服务器发送一个 SYN(Synchronize)包,请求建立连接,并随机生成一个初始序列号,此时客户端进入 SYN_SEND 状态。
- 第二次握手:服务器收到 SYN 包后,回应一个 SYN+ACK(Synchronize-Acknowledge)包,确认收到客户端的请求,并也随机生成一个初始序列号,同时将客户端的序列号加 1 作为确认号,此时服务器进入 SYN_RECV 状态。
- 第三次握手:客户端收到服务器的 SYN+ACK 包后,向服务器发送一个 ACK 包,确认收到服务器的响应,将服务器的序列号加 1 作为确认号,此时客户端进入 ESTABLISHED 状态,服务器收到客户端的 ACK 包后,也进入 ESTABLISHED 状态,连接建立成功。
- 数据传输:连接建立后,发送方将应用层数据分割成合适大小的数据包,并为每个数据包添加 TCP 报头,其中包含序列号等信息,然后通过网络发送给接收方。接收方收到数据包后,根据序列号对数据进行重组和排序,并检查数据的完整性,若数据无误,则向发送方发送确认消息123.
- 四次挥手释放连接4 :
- 第一次挥手:客户端发送一个 FIN(Finish)包给服务器,表示自己没有数据要发送了,请求关闭连接,此时客户端进入 FIN_WAIT_1 状态。
- 第二次挥手:服务器收到 FIN 包后,向客户端发送一个 ACK 包,确认收到客户端的关闭请求,此时客户端进入 FIN_WAIT_2 状态,服务器进入 CLOSE_WAIT 状态。
- 第三次挥手:服务器处理完剩余数据后,也发送一个 FIN 包给客户端,请求关闭连接,此时服务器进入 LAST_ACK 状态。
- 第四次挥手:客户端收到服务器的 FIN 包后,向服务器发送一个 ACK 包,确认收到服务器的关闭请求,此时客户端进入 TIME_WAIT 状态,等待一段时间(2MSL,Maximum Segment Lifetime)后,确保服务器收到了 ACK 包,客户端才正式关闭连接,服务器收到客户端的 ACK 包后,立即关闭连接。
TCP 报文格式
一个 TCP 报文段分为首部和数据两部分,其首部格式如下5 :
源端口(16 位) | 目的端口(16 位) | ||
---|---|---|---|
序列号(32 位) | |||
确认序列号(32 位) | |||
报头长度(4 位) | 预留(6 位) | 代码位(6 位) | 窗口大小(16 位) |
校验和(16 位) | 紧急指针(16 位) | ||
可选项(0 或 32 位) |
应用场景
由于 TCP 具有可靠性高、能保证数据顺序等特点,适用于对数据传输质量要求较高的应用,如:
- 文件传输:如 FTP 协议,可确保文件在网络传输过程中的完整性和准确性,避免文件损坏或丢失123.
- 电子邮件:如 SMTP、POP3 等协议,保证邮件内容的可靠传递,确保用户能够准确无误地接收和发送邮件123.
- 网页浏览:HTTP 协议在传输网页数据时,通常基于 TCP 连接,以保证网页的各个元素(如 HTML、CSS、图片等)能够完整、有序地传输到浏览器,呈现出正确的页面内容13.
- 远程登录:如 Telnet、SSH 等协议,通过 TCP 连接实现用户与远程主机之间的可靠交互,确保命令和数据的准确传输123.
参考:
小林coding