Computers

TCP协议

Posted on 11-14 2019,3 min read

TCP协议


Organized by安南 City

Completion time2019-11-14

Send error to emailcity@nanzc.com


可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

 

状态码

状态码:传输数据过程中具有特殊意义的标识

SYN:开始,请求建立连接

FIN:结束,请求关闭连接

ACK:确认

seq:序列号(当前数据包本身序列号)

ack:下一序列号(期望下次数据包序列号)

 

三次握手


SYNClient == SYN = 1 seq = x ==> Server

Client主动请求建立连接SYN = 1(SYN置1),并随机生成序列号seq = x(初始为0),随后发送报文给Server,进入SYN_SEND状态。

SYN - ACKClient <== SYN = 1 ACK = 1 seq = y ack = x + 1 == Server

Server收到报文后,被动回应Client建立连接请求将SYN = 1确认请求ACK = 1,随机生成序列号seq = y,并约定下次数据包序列号ack = x + 1,进入SYN_RECV状态。

ACKClient == ACK = 1 seq = x + 1 ack = y + 1 ==> Server

Client收到应答报文验证,回应Server确认收到报文ACK = 1,按照约定数据包序列号seq = x + 1,也约定下次数据包序列号ack = y + 1, 进入Established状态 。

标志着连接建立成功,可以开始传输数据。

 

四次挥手


FINClient == FIN = 1 seq = u ==> Server

Client主动请求关闭连接FIN = 1,并随机生成序列号seq = u,发送给ServerClient进入FIN_WAIT_1状态。

ACKClient <== ACK = 1 seq = v ack = u + 1 == Server

Server收到FIN后回复确认请求 ACK = 1,并随机生成序列号seq = v,约定下次数据包序列号ack = u + 1Server进入CLOSE_WAIT状态。

Client进入FIN_WAIT_2状态。==>×

FINClient <== FIN = 1 seq = w ack = u + 1 == Server

Server随即向Client发送关闭连接请求FIN = 1,并随机生成序列号seq = w,约定下次数据包序列号ack = u + 1Server进入LAST_ACK状态。

ACKClient == ACK = 1 seq = u + 1 ack = w + 1 ==> Server

Client收到FIN后,Client进入TIME_WAIT状态,并按照确认收到标识ACK = 1,约定序列号seq = u + 1 ,以及约定下次数据包序列号ack = w + 1发送报文,Server进入CLOSED状态。

标志着连接关闭成功,通道已封闭。

 

下一篇: Vue - 配置less环境