本基本知识整理及代码源于牛客网C++面试宝典导读,
网址https://www.nowcoder.com/tutorial/93/e1b14ab2b40a4ef98d9e55830eb48d66
TCP
建立连接和断开连接过程:
建立连接:
三次握手:
1.客户端将标志位SYN置为1,随机产生一个值标志位seq=i,将该数据包发送给服务器,客户端进入SYN_SENT状态,等待服务器确认。
2.服务器收到数据包后由SYN=1知道客户端请求建立连接,服务器将SYN和ACK都置为1,ack=i+1,随机产生seq=j,并将数据包发送给客户端,进入SYN_RCVD状态。
3.客户端收到确认后,检查ack=i+1,ACK=1,如果正确将ACK置1,ack=j+1,将数据包发送给服务器,服务器检查ack=j+1,ACK=1,如果正确则建立连接。
为什么要三次握手:
防止客户端已失效的连接请求传到B,产生错误。
例如:客户端发送第一个请求,超时后再次发送请求,最后有两个请求到达服务器,如果没有三次握手,则会建立两个连接,而只有一个连接有效,另一个连接则会占用服务器资源。如果采用三次握手,服务器收不到第二个请求确认,则不会建立第二个连接。
断开连接:
四次挥手:
TCP连接时全双工的,因此每个方向都要单独关闭。
1.客户端发送FIN报文,停止发送数据,进入FIN_WAIT_1状态,此时客户端还可以接受数据。
2.服务器收到FIN报文后,发送ACK给客户端,服务器进入CLOSE_WAIT状态,客户端收到后进入FIN_WAIT_2状态。
3.当服务器没有数据要发送时,发送FIN报文,服务器进入LAST-ACK状态,等待客户端确认。
4.客户端收到FIN报文后,发送ACK报文,客户端进入TIME_WAIT状态,等待2MSL(报文最大生存时间),然后关闭连接。