TCP的三次握手,四次挥手

以下内容参考:https://blog.csdn.net/qzcsu/article/details/72861891
https://blog.csdn.net/zhangliangzi/article/details/52554439
https://www.cnblogs.com/Andya/p/7272462.html

UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等
TCP,提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等

TCP Header:
这里写图片描述

1、第一个4字节:

(1)源端口,16位;发送数据的源进程端口
(2)目的端口,16位;接收数据的进程端口

2、第二个4字节与第三个4字节

(1)序号,32位, 代表当前TCP数据段第一个字节占整个字节流的相对位置,TCP连接中传送的字节流中的每个字节都按顺序编号。

例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;

(2)确认号,32位;代表接收端希望接收的数据序号,为上次接收到数据报的序号+1,当ACK标志位为1时才生效,是期望收到对方下一个报文的第一个数据字节的序号。

例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701

3、第四个4字节:

(1)数据偏移,4位;它指出TCP报文的数据距离TCP报文段的起始处有多远;实际代表TCP首部长度,最大为60字节。
(2)保留,占6位,保留今后使用
(3)6个标志位,每个标志位1位;
SYN,为同步标志,用于数据同步;在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
ACK,为确认序号,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
FIN,为结束序号,用于发送端提出断开连接;用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
URG,为紧急序号,URG=1是紧急指针有效;告诉系统此报文段中有紧急数据;
PSH,指示接收方立即将数据提交给应用层,而不是等待缓冲区满;当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
RST,重置连接。当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
(3)窗口值,2个字节(16位)**
标识接收方可接受的数据字节数。通知接收方,发送本报文你需要有多大的空间来接受;

4、第五个4字节

(1)校验和,16位;用于检验数据完整性。
(2)紧急指针,16位;只有当URG标识位为1时,紧急指针才有效。紧急指针的值与序号的相加值为紧急数据的最后一个字节位置。用于发送紧急数据。

tcp三次握手:

这里写图片描述

总的来说:

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

  • 最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
  • TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;

第一次握手: A的TCP客户进程也是首先创建传输控制块TCB,然后向B发出请求连接报文段(首部的同步为SYN=1,初始序号seq=x ),(SYN=1的报文段不携带数据,但是要消耗掉一个序号),此时客户进程进入SYN-SENT(同步已发送)状态
第二次握手: 服务端收到请求报文后,如果同意建立连接,会向客户端发送确认,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),服务端进程进入SYN-RCVD(同步收到)状态;
第三次握手: 客户端进程收到服务端的确认后,要向服务端发出确认报文段(ACK=1,确认号ack=y+1,序号seq=x+1),ACK报文段可以携带数据,不携带数据则不消耗序号。TCP连接已经建立,A进入ESTABLISHED(已建立连接)
B收到A的确人后,也进入ESTABLISHED状态。

TCB传输控制块: Transmission Control Block,存储每一个连接中的重要信息,如TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号。

TCP四次挥手:

这里写图片描述

tcp的四次断开其实是这样的一个过程:

1、假设Client端发起中断连接请求,也就是发送FIN报文。意思是说:我Client端没有数据要发给你了,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。
2、Server端接到FIN报文后,先发送ACK:告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。
这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
3、当Server端确定数据已发送完成,则向Client端发送FIN报文:告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。
4、Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Server端收到ACK后,就知道可以断开连接了。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

第一次挥手: A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u)并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
第二次挥手: B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文字段。
第三次挥手: B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
第四次挥手: A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值