三次握手
第一次握手
客户端向服务器发送连接请求报文。报文中的同部位SYN=1,同时随机生成初始序列号seq=x,此时,TCP客户端进入了SYN-SENT(同步已发送状态),TCP规定,SYN报文表段,即第一次和第二次都不能携带数据,但需要消耗一个序列号。第一次握手表示,客户端想和服务器建立连接。
第二次握手
TCP服务器收到请求报文之后,如果同意连接,则发出确认报文。确认报文中包括ACK=1,SYN=1,确认序号为ack=x+1,同时也要为自己随机初始化一个序列号seq=y,此时,TCP服务器进入了SYN-RCVD(同步收到)状态。同样的,这个报文也不能携带数据,但是需要消耗一个序列号。这个报文带有SYN(建立连接)和ACK(确认)标志,询问客户端是否准备好。
第三次握手
TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。
TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。这里客户端表示我已经准备好。
思考:为什么要三次握手呢,有人说两次握手就好了
举例:已失效的连接请求报文段。
client发送了第一个连接的请求报文,但是由于网络不好,这个请求没有立即到达服务端,而是在某个网络节点中滞留了,直到某个时间才到达server,本来这已经是一个失效的报文,但是server端接收到这个请求报文后,还是会想client发出确认的报文,表示同意连接。
假如不采用三次握手,那么只要server发出确认,新的建立就连接了,但其实这个请求是失效的请求,client是不会理睬server的确认信息,也不会向服务端发送确认的请求,但是server认为新的连接已经建立起来了,并一直等待client发来数据,这样,server的很多资源就没白白浪费掉了,采用三次握手就是为了防止这种情况的发生,server会因为收不到确认的报文,就知道client并没有建立连接。这就是三次握手的作用。
TCP的四次挥手
第一次挥手
TCP发送一个FIN(结束报文),用来关闭客户到服务器的连接。客户端进程发出连接释放报文,并且停止发送数据。
释放报文首部为FIN=1,其序列号seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入终止等待1状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
第二次握手
服务器收到这个FIN报文之后,会过客户端发送一个确认ACK报文,确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号
服务器收到连接释放报文之后,发出确认报文,ACK=1,ack=u+1,并带上自己的序列号seq=v,这时,服务器就进入了关闭等待状态。
TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
第三次握手
服务器发送一个FIN报文到客户端,服务器关闭客户端连接。
服务器将最后的数据传给客户端之后,就向客户端发送连接释放报文,FIN=1,ACK=1,ack=u+1,由于在半关闭状态的时候,还有可能发送一些数据,所以,假定此时的序列号seq=w,此时,服务器进入最后确认状态,等待客户端的确认。
第四次握手
客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB(进程控制块)后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
那么为什么是4次挥手呢?
关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
CP和UDP的区别
1、基于连接与无连接;UDP是无连接的,即发送数据之前不需要建立连接
2、TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
5、TCP对系统资源要求较多,UDP对系统资源要求较少。