网络参考模型
网络层是端点间的(客户端、服务端)
链路层是跳跃节点间的。
TCP/IP 下一跳模式(网关) 内存小,速度快,不可靠。(网络号、主机号)
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式
三次握手
目的是建立链接
简单理解:
1. Client 发送一个数据包(syn)
2. Server 收到 数据包(syn),会发送一个数据包(syn+ack),这是一个确认的过程
3. Client 收到数据包(syn+ack),会发送一个数据包(ack)给Server
一旦三次握手之后,双方就建立了链接,共双发发送和接受资源。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,Client发送syn包(syn=j)到Server,并进入SYN_SEND状态,等待Server确认;
第二次握手:Server收到syn包,必须确认Client的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时Server进入SYN_RECV状态;
第三次握手:Client收到Server的SYN+ACK包,向Server发送确认包ACK(ack=k+1),此包发送完毕,Client和Server进入ESTABLISHED状态,完成三次握手。 完成三次握手,Client与Server开始传送数据.
四次挥手
目的是断开链接,释放资源
简单理解
- Client 向Server 发送一个数据包(fin)
- Server 收到数据包(fin),向Client发送一个数据包(ack), ack确认。
- Server 发送ack数据包后,再发送一个数据包(fin)
- Client 发送一个数据包(ack)ack确认
socket 是套接字 ip+port + ip+port(Client:设备的IP地址+端口号,Server的IP地址+端口号)
port:端口号 有65535个端口号
ACK :TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
FIN :(finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
ESTABLISHED : 已经建立连接
发送序列号:Sequence Number
确认序列号:Acknowledgment Number
FIN_WAIT_1:表示等待对方的FIN报文。当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1 状态
FIN_WAIT_2:也表示等待对方的FIN报文。FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。你回复一个ACK给对方,并进入CLOSE_WAIT状态。接下来就是查看你是否还有数据要发送给对方,如果没有,就可以close这个socket,并发送FIN给对方,即关闭连接。
CLOSING:表示Client给Server发送FIN后,并没有收到Server回应的ACK,而收到了Server发送的FIN。表示双方同时close一个socket,出现同时发送FIN现象。
LAST_ACK: 发送FIN报文后,等待对方的ACK报文,当收到ACK报文后,进入到CLOSED状态。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK确认,等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态。
第一次挥手:Client向Server,发送FIN报文段,表示关闭数据传送,并Client进入FIN_WAIT_1状态,表示没有数据要传输了
第二次挥手:Server收到FIN报文段后进入CLOSE_WAIT状态(被动关闭),然后发送ACK确认,表示同意你关闭请求了,Client到主机的数据链路关闭,主机进入FIN_WAIT_2状态
第三次挥手:Server等待Client发送完数据,发送FIN到Client请求关闭,Server进入LAST_ACK状态
第四次挥手:Client收到Server发送的FIN后,回复ACK确认到Server,Client进入TIME_WAIT状态。Server收到Client的ACK后就关闭连接了,状态为CLOSED。Client等待2MSL,仍然没有收到Server的回复,说明Server已经正常关闭了,Client关闭连接。