一相关补充
1.TCP三次握手
1.第一次握手:客户端调用connect,发送位码为SYN=1(用于标记位置),随机产生初始序列号seq=x的数据包到服务器。服务端由SYN=1了解到,客户端要求建立连接;此时cilent进入SYN_SENT状态
2.第二次握手:服务器收到请求后需要确认联机的信息,向客户端发送确认号ACK=x+1,SYN=1,随机产生的序列号seq=y数据包;此时服务端进入SYN_RECV状态
3.第三次握手:客户端收到后检查ACK是否正确,以及位码SYN是否正确。若正确,客户端会再次发送ACK确认包,此时客户端进入ESTABLISHED状态,表明客户端已经准备好;服务端收到客户端的ACK后会从SYN_RECV转移到ESTABLISHED状态,此时服务端及客户端就可以进行数据传输了
2.TCP四次挥手
1.FIN_WAIT_1:需要终止连接时,客户端调用close函数发送FIN给服务端,等待服务端返回ACK确认信息,此时进入FIN_WAIT_1状态
ps:需要注意执行主动关闭的一方可以是客户端,也可以是服务端,这里以客户端主动关闭为例
2.CLOSE_WAIT:服务端接收到FIN后,向客户端发送ACK确认信息,同时自身进入CLOSE_WAIT状态;CLOSE_WAIT状态可以理解为服务端正在等待上层应用程序发出关闭连接指令;并且由于TCP关闭时双工过程,所以服务端在接受到FIN后,也需要调用close函数进行关闭;当服务端发送FIN后,服务端就进入了LAST_ACK状态。
3.FIN_WAIT2:客户端接收到服务端返回的ACK后,进入此状态
4.LAST_ACK:服务端发送关闭请求,由状态2进入最后确认状态,具体动作为发送FIN给客户端,同时在接收到ACK后会进入CLOSED状态
5.CLOSING:两边同时发起关闭请求时(即主动方发送FIN,等待被动发返回ACK,同时被动方也发送了FIN,主动发接收到FIN后,发送ACK给被动方),主动方会由FIN_WAIT_1进入此状态,
6.TIME_WAIT:在收到服务端的FIN后进入的状态,之后会进入CLOSE状态;共有三个状态会进入该状态
1)TIME_WAIT存在理由:可靠的实现TCP全双工连接的终止;允许老的重复分节(数据报)在网络中消逝
三个状态
1.由CLOSING进入:同时发起关闭情况下,当主动端接收到ACK后,进入此状态,实际为:客户端发起关闭请求,发送FIN后等待服务器端回应ACK,但此时服务器端同时也发起关闭请求,也发送了FIN,并且被客户端先于ACK接收到
2.由FIN_WAIT_1进入:发起关闭后,发送了FIN,等待ACK的时候,正好被动方(服务器端)也发起关闭请求,发送了FIN,这时客户端接收到了先前的ACK,也收到了FIN,然后向服务器端发送ACK,与CLOSING进入的状态不同的是接收到FIN和ACK的先后顺序
3.由FIN_WAIT_2进入:这是不同的情况,主动方在完成自身发起的主动关闭请求后,接收到了对方发送过来的FIN,然后回应ACK
3.基本TCP客户/服务器程序的套接字函数
TCP服务器
1.socket:向内核或库调用,发起socket系统调用或库调用,创建套接字文件
2.bind:将端口与套接字进行绑定,
3.listen:若绑定完成则处于监听状态
4.accept:处于监听状态并可以接收客户端请求
5.read:读取客户端的数据请求
6.write:处理客户端的数据请求并写入套接字文件中,内核通过此套接字文件向客户端进行数据应答;
ps:若有多段请求则循环数据请求,数据应答过程直到处理完相关数据
TCP客户端
1.socket:同理创建套接字,但其端口为随机创建
2.connect:使用connect函数通过TCP三次握手与服务端创建相关通信连接
3.write:客户端向服务端发起数据请求
4.read:客户端通过本地套接字读取服务端发来的数据
5.close:处理完相关数据,向服务端发送文件结束通知,服务端读取后关闭相关通信