三次握手和四次挥手简述
三次握手:客户端与服务器进行三次通信
四次挥手:客户都拿和服务器通过四次通信释放连接,也叫连接终止协议
三次握手的目的:
三次握手是为了让客户端和服务器分别确认自己和对方接收和发送消息的能力是正常的
三次握手流程
1.第一次握手
客户端向服务端发送连接请求报文段。该报文段的头部中同步SYN=1,确认ACK=0,同时选择一个初始序号seq=x。请求发送后,客户端便进入SYN-SENT状态。
SYN=1,ACK=0表示该报文段为连接请求报文
x为本次TCP通信的字节流的初始序号
TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号
2.第二次握手
服务端收到连接请求报文段后,如果同意连接,会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。发送完应答后服务端进入SYN-RCVD状态。
SYN=1,ACK=1表示该报文段为连接同意的应答报文
seq=y表示服务端作为发送者时,发送字节流中的第一个字节序号
ack=x+1表示服务端希望客户端发送的下一个数据报初始序号是从x+1开始
3.第三次握手
客户端收到服务端连接同意的应答后,还会向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1。
客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!
四次挥手:
第一次挥手:
客户端向服务器发送FIN报文(FIN=1,seq=u),发完后进入FIN_WAIT_1状态,即主动关闭TCP连接,不再发送数据,但可以接收服务器发来的报文,等待服务器回复;
第二次挥手:
服务器接到FIN报文后,返回一个ACK报文(ACK=1,ack=u+1,seq=v),表明自己接收到此报文,服务器进入CLOSE_WAIT关闭等待状态,此时客户端就知道服务端接到自己的断开连接请求,进入到FIN_WAIT_2状态,TCP处于半关闭状态,但服务器端可能还有数据要传输。
第三次挥手:
服务器关闭客户端连接,发送FIN报文(FIN=1,seq=w,ack=u+1)给客户端,此时服务器处于LAST_ACK状态,等待客户端回应。
第四次挥手:
客户端收到FIN报文后,发送一个ACK(ACK=1,ack=w+1,seq=u+1)给服务器作为应答,此时客户端处于TIME_WAIT状态,这个状态是为了等待足够的时间以确保TCP接收到连接中断请求的确认
注意:这时候服务器的tcp连接并没有被释放,客户端需要等待2MSL(MSL是报文来回的时间)
等待的原因:
防⽌客户端最后⼀次发给服务器的确认在⽹络中丢失以⾄于客户端关闭,⽽服务端并未关闭,导致资源的浪费。
等待最⼤的2msl可以让本次连接的所有的⽹络包在链路上消失,以防造成不必要的⼲扰
总结:三次握手和四次挥手一共发送了两次ack
tcp和udp的区别?
tcp是面向连接的,而udp是无连接的协议
tcp对于传输有用的数据非常可靠,因为它需要确认发送的信息,此外,重新发送丢失的数据包
udp如果数据包丢失,他不会请求重新传输
tcp速度较慢,因为tcp在传递数据之前建立连接,并确保数据包的正确传递
udp不承认是否接收了传输的数据
udp的标头大小为8个字节,tcp的标头是udp的两倍多
相同点:
tcp和udp都可以检查错误,但是只有tcp可以纠正错误,因为它同时具有拥塞和流量控制
举个栗子:
我想扔给别人一个苹果,我需要向别人确认是否需要他能否接住以及他的身份等一些其他信息,我需要反复确认,直到确认无误之后才会将苹果给他,这就是我们的tcp
我给别人一个苹果,我不管他是不是需要,是不是能接住,都要扔给他,能不能接住,是不是我想给的那个人,我都不管,反正我给了,这就是udp