TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。
有3个过程:建立连接、传输数据、断开连接。
UDP是基于IP之上开发能和应用打交道的协议。
TCP要完成传输过程,有三个关键步骤,分别是:三次握手、传输确认、四次挥手。
![](https://i-blog.csdnimg.cn/blog_migrate/db0c865a7be2da9380b95307099e58cc.png)
三次握手
1. 客户端发送到服务器。客户端发送 SYN 报文给服务器,并且指明客户端初始化序列号为 ISN(c) ,即以 SYN=1, seq=x 的形式发送过去。此时客户端处于 SYN_SEND 状态。
2. 服务器发送给客户端。服务器收到客户端的 SYN 和 ISN(c) ,也发送一个 SYN 回去,同时设置 ACK = ISN(c) + 1 以及指明服务器初始化序列号为 ISN(s) ,即以 SYN=1, ACK=x+1,seq=y 的形式发送给客户端。
3. 客户端发送到服务器。客户端收到服务器发送的消息后,设置 ACK = ISN(s) + 1 ,将自身的 ISN(c) + 1 ,即以 ACK=y+1, seq=x+1 的形式发送给服务器。此时客户端处于 ESTABLISHED 阶段,服务器收到报文,也处于 ESTABLISHED 阶段,双方建立了连接。
三次握手的目的:
1、 客户端发送数据给服务器,服务器确认自己可以接受客户端的请求。
2、服务器发送数据给客户端,客户端确认可以发送数据给服务器,也可以接受到服务器的请求。
3、客户端发送数据给服务器,服务器确认自己可以发送数据给客户端。
可否携带数据:
答案:第三次握手的时候可以携带,第一第二次不可以携带。
原因:如果第一次可以携带数据的话,有可能是恶意攻击服务器。这时候释放大量的数据,不理会服务器的的承受能力,让服务器花费很多时间、内存空间接收报文。
第三次握手的时候,客户端处于 ESTABLISHED 状态了,它可以建立连接并且知道服务器的接收、发送能力是正常的,所以可以携带数据了。
![](https://i-blog.csdnimg.cn/blog_migrate/a9b361258b7fbfd1f3e448b2d72489d4.png)
四次挥手
客户端发送给服务器。客户端以 FIN=1, seq=u 的形式发送给服务器,表示需要关闭客户端和服务器的数据传输。此时客户端处于 FIN_WAIT 状态。
服务器发送给客户端。服务器收到信息,先返回 ACK 给客户端,即以 ACK=1, seq=v, ack=u+1 的形式返回给客户端,表示收到客户端报文了。此时服务器处于 CLOST_WAIT 状态。
服务器发送给客户端。服务器等待一会,看客户端还有没有数据没发过来,等处理完这些数据之后,也想断开连接了,于是发送 FIN 给客户端,即以 FIN=1, ACK=1, seq=w, ack=u+1 的形式发送给客户端。此时服务器处于 LAST_ACK 状态。
客户端发送给服务器。客户端收到 FIN 之后,返回 ACK 报文作为应答,即以 ACK=1,seq=w+1 的形式发送给服务器。此时客户端处于 TIME_WAIT 状态。