TCP连接重点
- TCP的特点是操作系统底层会发送数据包告诉对方,我收到了。
- 发送数据前,会进行三次握手,确保客户端和服务端都准备好接收数据
三次握手 详解
- 客户端先发送一个值,SYN:J(SYN标记请求)
- 服务端收到了客户端发送的SYN的值J,把J+1,然后把ACK:J+1发送回给客户端。同时发送一个值SYN:K给客户端(ACK标记应答)
- (把SYN和ACK一起发送的原因是:为了保证客户能尽快的得到数据,所以三次可以提升传输的效率)
- 客户端收到了服务器发送的SYN的值K,把K+1,然后把ACK:K+1发送给服务端
四次挥手 详解
- 客户端调用close(),socket的发送功能关闭,系统底层发起关闭请求。通知服务器,客户端不会再给服务器发送任何应用程序的请求。
- 服务端的的recv()方法将会收到一个空值,然后服务端的接收功能关闭。
- 服务端调用close(),系统底层发起关闭请求,通知客户端,服务端不会再给客户端发送任何数据,并设置超时等待时间,如果时间内没收到确认,将再次发送发起关闭请求。
- 客户端系统底层收到服务端发送的请求,向服务器发送确认信息,并等待两个信息传送的时单位之后(一般两分钟),再释放资源。
Q1:为什么不能三次挥手?
因为服务端接收到客户端关闭的请求之后,不一定立刻调用close()方法,释放资源。所以必须四次
Q2:为什么一般都客户端先调close()方法?
TCP为了保证数据可靠性,数据接收方会回应数据发送方已收到的确认消息,四次挥手的时候会等待两分钟再释放资源。所以简单来说,谁先发起close,谁的资源等待2分钟后再释放,期间不能重复使用。如果是服务器发起请求的话,就将占用这个端口等资源。
Q3:为什么四次挥手客户端要等待两个信息传送的时单位之后再释放资源?
1、因为服务端超时等待的原因,如果没有收到客户端的确认信息将会一直发送确认信息。而确认信息因为网络等问题,可能会到来的比较缓慢。如果客户端不等待直接释放的话,就不能发送确认信息给服务端,服务端无法释放资源。
2、两个信息传送的时单位是指客户端发送确认信息之后,如果服务端没收到,将会再次发送请求,一共两次信息传送的时间。