您现在的位置是:首页 >其他 >Netty 基础学习(一)TCP模型详解网站首页其他
Netty 基础学习(一)TCP模型详解
简介Netty 基础学习(一)TCP模型详解
目录
Netty官网:Netty: Home
参考教程:计算机网络
网络的基本结构
一 TCP协议详解
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议,常用于互联网协议套件中的应用层协议(例如 HTTP、FTP 等)。
TCP 协议采用了分层的设计,分别包括应用层、传输层、网络层和数据链路层。其中,TCP 协议属于传输层协议。
TCP 协议主要包括以下几个方面:
- 面向连接:在传输数据前,TCP 协议会先建立连接,然后才进行数据传输,传输完成后再断开连接。这种方式可以保证数据传输的可靠性,但会增加一定的延迟和开销。
- 可靠性:TCP 协议采用了各种机制来保证数据传输的可靠性,例如数据确认、超时重传、流量控制等。
- 基于字节流:TCP 协议传输的是一个个字节流,没有消息边界,因此需要通过应用层协议来解决消息的分割和组装问题。
- 拥塞控制:TCP 协议会根据网络状况来动态地调整数据传输的速率,防止网络拥塞和数据丢失。
- 三次握手和四次挥手:TCP 协议建立连接时采用了三次握手的方式,断开连接时采用了四次挥手的方式,以保证数据的可靠传输和连接的正常关闭。
- TCP 标志位:TCP 协议中有一些标志位,用于控制数据传输的行为,例如 SYN、ACK、FIN 等。
功能
- 对应用层报文进行分段和重组;
- 面向应用层实现复用与分解;
- 实现端到端的流量控制;
- 拥塞控制;
- 传输层寻址;
- 对收到的报文进行差错检测(首部和数据部分都检错);
- 实现进程间的端到端可靠数据传输控制。
特点
- TCP是面向连接的协议;
- TCP是面向字节流的协议;
- TCP的一个连接有两端,即点对点通信;
- TCP提供可靠的传输服务;
- TCP协议提供全双工通信(每条TCP连接只能一对一);
1.1 TCP 报文结构
最大报文段长度:报文段中封装的应用层数据的最大长度。
- 源端口号(16 位):指发送端口号。
- 目的端口号(16 位):指接收端口号。
- 序列号(32 位):指发送的第一个字节的序列号。用于排序和重组收到的数据。
- 确认号(32 位):指期望收到的下一个字节的序列号。用于确认已经成功接收到的数据。
- 数据偏移(4 位):指 TCP 报文头部的长度,以 4 字节为单位。最大长度为 15,因此 TCP 报文头部的最大长度为 60 字节。
- 保留位(6 位):预留,必须为 0。
- 控制位(6 位):用于控制 TCP 协议的行为,包括 SYN、ACK、FIN、RST、URG、PSH 等标志。
- 窗口大小(16 位):指接收方可用于缓存数据的字节数,用于流量控制。
- 校验和(16 位):用于校验 TCP 报文的完整性。
- 紧急指针(16 位):用于指示紧急数据的位置,仅在 URG 控制位被设置时有效。
- 选项(可变长度):可选的 TCP 报文选项,包括最大报文长度、时间戳等。
我们来个案例来理解一下:
Source Port: 1234 (0x04D2)
Destination Port: 80 (0x0050)
Sequence Number: 2486259810 (0x9443FB7A)
Acknowledgment Number: 1450201933 (0x567B5D5D)
Data Offset: 5 (0x50)
Flags: 0x18 (PSH, ACK)
Window Size: 65535 (0xFFFF)
Checksum: 0x836A
Urgent Pointer: 0
Data:
POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 23
username=johndoe&password=secret
- 源端口号:1234
- 目的端口号:80
- 序列号:2486259810
- 确认号:1450201933
- 数据偏移:5
- 控制位:PSH, ACK (表示推送数据,并确认已经收到的数据)
- 窗口大小:65535
- 校验和:0x836A
- 紧急指针:0
报文数据部分包括一个 HTTP POST 请求,用于向 example.com 发送登录信息,这个请求包括 HTTP 头部和表单数据。
TCP首部
- 序号字段:TCP的序号是对每个应用层数据的每个字节进行编号
- 确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到。用ack_seq标识;
- TCP段的首部长度最短是20B ,最长为60字节。但是长度必须为4B的整数倍
TCP标记
1.2 TCP的可靠性
- 序列号和确认应答机制:TCP 在传输数据时,使用序列号和确认应答机制来保证数据的可靠传输。发送方将每个数据段标记一个唯一的序列号,接收方通过发送确认应答来表示已经成功接收到该数据段。如果发送方没有收到确认应答,则会重新发送数据段,直到接收方成功接收为止。
- 超时重传机制:为了保证数据能够及时传输,TCP 协议还采用了超时重传机制。发送方在发送数据时会设置一个定时器,如果在规定的时间内没有收到接收方的确认应答,则会重新发送该数据段。
- 流量控制机制:为了防止发送方发送过多的数据导致接收方无法处理,TCP 还采用了流量控制机制。接收方会在每个确认应答中通知发送方自己当前可以接收的数据量,从而控制发送方的发送速度。
- 拥塞控制机制:TCP 还采用了拥塞控制机制,用于避免网络拥塞导致数据丢失和延迟。拥塞控制机制根据网络的拥塞程度动态调整发送方的发送速度,从而保证网络的稳定性和数据的可靠传输。
1.2.1 序列号与确认应答
- TCP 报文段中包含了序列号和确认应答号字段。TCP 使用序列号对发送的每个字节进行编号,从而将字节流转换成一个连续的数据流。同时,TCP 还使用确认应答机制来保证数据的可靠传输。接收方会在每个确认应答中发送确认应答号,表示已经成功接收到该数据段中的数据。
- 通过序列号和确认应答机制,TCP 可以保证数据在传输过程中的可靠性。发送方将每个数据段标记一个唯一的序列号,接收方通过发送确认应答来表示已经成功接收到该数据段。如果发送方没有收到确认应答,则会重新发送数据段,直到接收方成功接收为止。
1.2.2 超时重传机制
TCP 协议还采用了超时重传机制。发送方在发送数据时会设置一个定时器,如果在规定的时间内没有收到接收方的确认应答,则会重新发送该数据段。通过超时重传机制,TCP 可以保证即使在网络出现问题的情况下,数据仍能够被可靠地传输。
1.2.3 流量控制机制
- 为了防止发送方发送过多的数据导致接收方无法处理,TCP 还采用了流量控制机制。接收方会在每个确认应答中通知发送方自己当前可以接收的数据量,从而控制发送方的发送速度。
- TCP 流量控制机制的核心在于接收方向发送方发送窗口大小信息,该信息表示接收方当前还可以接收多少字节的数据。发送方会根据接收方返回的窗口大小来调整发送速度,从而避免发送方发送过多的数据导致网络拥塞和数据丢失。
1.2.4 拥塞控制机制
- TCP 协议还采用了拥塞控制机制,用于避免网络拥塞导致数据丢失和延迟。拥塞控制机制根据网络的拥塞程度动态调整发送方的发送速度,从而保证网络的稳定性和数据的可靠传输。
- TCP 拥塞控制机制的核心在于采用了四种算法:慢启动、拥塞避免、快速恢复和快速重传。其中,慢启动算法用于初始建立连接时,将发送方的发送速度逐渐加速,拥塞避免算法用于控制发送方的发送速度,当网络拥塞时,TCP 会自动将发送速度降低,快速恢复算法用于快速恢复拥塞窗口的大小,从而加速数据传输,快速重传算法用于快速重传丢失的数据包,避免等待超时重传导致的网络拥塞。
1.3 TCP的三次握手
面试题:为啥需要三次握手?
- 第一次握手:客户发送请求,此时服务器知道客户能发;
- 第二次握手:服务器发送确认,此时客户知道服务器能发能收;
- 第三次握手:客户发送确认,此时服务器知道客户能收。
1.3.1 建立连接
- 第一次:客户向服务器发送连接请求段,建立连接请求控制段(SYN=1),表示传输的报文段的第一个数据字节的序列号是x,此序列号代表整个报文段的序号(seq=x);客户端进入 SYN_SEND (同步发送状态);
- 第二次:服务器发回确认报文段,同意建立新连接的确认段(SYN=1),确认序号字段有效(ACK=1),服务器告诉客户端报文段序号是y(seq=y),表示服务器已经收到客户端序号为x的报文段,准备接受客户端序列号为x+1的报文段(ack_seq=x+1);服务器由LISTEN进入SYN_RCVD (同步收到状态);
- 第三次:客户对服务器的同一连接进行确认.确认序号字段有效(ACK=1),客户此次的报文段的序列号是x+1(seq=x+1),客户期望接受服务器序列号为y+1的报文段(ack_seq=y+1);当客户发送ack时,客户端进入ESTABLISHED 状态;当服务收到客户发送的ack后,也进入ESTABLISHED状态;第三次握手可携带数据;
TCP 三次握手是在建立 TCP 连接时必须要进行的步骤。它的过程就像两个人打招呼一样:
- 第一次握手:发送方向接收方发送一个“你好”(SYN)的信息,并告诉接收方自己的初始序列号(ISN)。
- 第二次握手:接收方收到信息后向发送方发送一个“你好,我收到了”(SYN+ACK)的信息,同时告诉发送方自己的初始序列号(ISN)和确认序列号(ACK)。
- 第三次握手:发送方再次向接收方发送一个确认信息“好的,我收到了”(ACK),表示接收方的确认信息已经收到。
通过这三次握手,发送方和接收方之间建立了一个可靠的连接,并且确认了彼此的身份和初始序列号。这样在后续的数据传输过程中,双方就可以相互确认数据是否传输成功,从而保证数据的可靠性。
1.4 TCP四次挥手
释放连接
- 第一次:客户向服务器发送释放连接报文段,发送端数据发送完毕,请求释放连接(FIN=1),传输的第一个数据字节的序号是x(seq=x);客户端状态由ESTABLISHED进入FIN_WAIT_1(终止等待1状态);
- 第二次:服务器向客户发送确认段,确认字号段有效(ACK=1),服务器传输的数据序号是y(seq=y),服务器期望接收客户数据序号为x+1(ack_seq=x+1);服务器状态由ESTABLISHED进入CLOSE_WAIT(关闭等待); 客户端收到ACK段后,由FIN_WAIT_1进入FIN_WAIT_2;
- 第三次:服务器向客户发送释放连接报文段,请求释放连接(FIN=1),确认字号段有效(ACK=1),表示服务器期望接收客户数据序号为x+1(ack_seq=x+1);表示自己传输的第一个字节序号是y+1(seq=y+1);服务器状态由CLOSE_WAIT 进入 LAST_ACK (最后确认状态);
- 第四次:客户向服务器发送确认段,确认字号段有效(ACK=1),表示客户传输的数据序号是x+1(seq=x+1),表示客户期望接收服务器数据序号为y+1+1(ack_seq=y+1+1);客户端状态由FIN_WAIT_2进入TIME_WAIT,等待2MSL时间,进入CLOSED状态;服务器在收到最后一次ACK后,由LAST_ACK进入CLOSED;
TCP 四次挥手是在关闭 TCP 连接时必须要进行的步骤。它的过程就像两个人告别一样:
- 第一次挥手:发送方向接收方发送一个“我要关闭连接了”(FIN)的信息,表示数据发送完毕,但是还可以接收数据。
- 第二次挥手:接收方收到信息后向发送方发送一个“好的,我知道了”(ACK)的确认信息。
- 第三次挥手:接收方向发送方发送一个“我也要关闭连接了”(FIN)的信息,表示自己也没有数据要发送了。
- 第四次挥手:发送方收到信息后向接收方发送一个“好的,我知道了”(ACK)的确认信息,表示自己也知道对方已经关闭了连接。
通过这四次挥手,双方分别关闭了自己的发送和接收通道,并确认对方的关闭请求,最终彻底关闭了 TCP 连接。这样可以避免数据的丢失和重复传输,保证数据的完整性和可靠性。
为什么需要等待2MSL?
- 最后一个报文没有确认;
- 确保发送方的ACK可以到达接收方;
- 2MSL时间内没有收到,则接收方会重发;
- 确保当前连接的所有报文都已经过期。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。