TCP/IP协议族![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217164712473.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDg2MjQ1Mw==,size_16,color_FFFFFF,t_70)
1.什么是TCP协议?
TCP(传输控制协议)是一种面向连接,可靠的,基于字节流的传输层协议通信,
2.三次握手的过程
第一次握手:客服端向服务端发起连接,这是将同步序列号SYN置为1,表示连接,并且自身随机生成一个序列号,如seq=X,消息发出之后,客户端状态置为同步已发出,
第二次握手:服务端收到连接之后,同意建立连接,发送给客户端应答码ack=X+1和确认号ACK=1,表示连接已确认回执给对方,并将自己的SYN置为1,表示连接,自身也随机生成一个序列号,如seq=y,消息发出后,客户端的状态置为同步收到
第三次握手:客户端收到服务端发的确认消息之后,状态置为已建立连接,需要给服务器做出应答,发送确认号ACK=1,并将自己的随机序列号seq=X+1,应答码随即改变为ack=y+1,此时服务器也建立了连接,开始传数据
3.TCp四次挥手
客户端和服务端建立TCP连接,传输万数据需要断开数据,双方是等价的,都可以发送断开的请求,下面以客户端A主动发送请求为例。
第一次挥手:客户端向服务器发送断开连接的消息,将FIN置为1,已请求释放连接,就是没有数据发给服务端了并且随机生成一个序列号seq=u
第二次挥手:服务器收到断开连接的消息后,发出确认消息,回执给客户端我已确认(ACK=1),并随机生成一个序列号 seq=v,并对对方的做出应答(ack=u+1),这时服务端关闭了连接,且A无法再给B发送数据
第三次挥手:服务端处理完数据后,通知客户端关闭连接,这时将FIN=1,ACk=1,自己的序列码为seq=w,应答码ack=u+1
第四次挥手:A收到B断开连接消息后需要发动确认消息,将ACK+1,确认号ack=w+1,seq=u+1,服务器收到后,就断开连接
常见问题
1.为什么建立连接协议是三次握手,而关闭确实四次握手?
进行连接时,可以将ACK和SYn放在一个报文里面来发送,因为传输数据是在建立连接之后才发的,但是关闭连接的时候,客户端发给FIN报文时,它仅仅表示对方没有数据发给你了,但是未必你没有数据不发给对方,所以你可能未必立马关掉socket,或许你需要发送一些数据给房,之后的话在发送FIN报文给对方表示你同意关闭连接,所以的话,这里ACK报文和FIN报文多数情况下是分开发的
2.为什么不能用两次握手?
3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认
如果发生两个握手的话,嘉定客户端给服务端发送一个连接请求,服务端收到这个请求,并发送确定了应答,按照两个握手的协定,服务端认为连接已经成功建立,可以发送数据了,因为客户端不知道服务端有没有收到请求,且连接是否建立成功,如果客户端的连接还未建立成功,则服务端发来的数据就会被忽视,只能等待客户端的链接应答,这时就会发生超时,超时之后服务端又会重新发送相同的数据,就形成了死锁。
3.如果已经建立连接,但是客户端突然出现故障怎么办?
其实TCP还设有一个保活计时器,如果客户端出现故障,服务器不能一直等下去,白白的浪费资源,服务端没收到一个客户端的请求都会重新复位这个计时器,通常设置为2小时,如果两个小时还没收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75S发送一个,若一连发送10个探测报文仍没反应,服务器就认为客户端出现故障,接着就关闭连接。