tcp/ip 三/四次握手,四次挥手~

时间:2022-11-04 08:10:23

rt

   (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
        (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
        (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
                (A)URG:紧急指针(urgent pointer)有效。
                (B)ACK:确认序号有效。
                (C)PSH:接收方应该尽快将这个报文交给应用层。
                (D)RST:重置连接。
                (E)SYN:发起一个新连接。
                (F)FIN:释放一个连接。

        需要注意的是:
                (A)不要将确认序号Ack与标志位中的ACK搞混了。
             (B)确认方Ack=发起方Req+1,两端配对。 


先 大概了解下基本概念。。

SYN是干什么用的?

在链接的时候创建一个同步序号,当SYN=1同时ACK=0的时候,表明这是一个连接请求的报文段。如果对方有意链接,返回的报文里面SYN=1,ACK=1,。从这个意义上来说,SYN=1的时候,就表明这是一个‘请求’或者‘接受请求’的报文。

SYN=1的报文段不能携带数据。但是要消耗掉一个序号,

ACK是干什么用的?

仅当ACK=1的时候,确认字号(期望收到对方下一个报文段的第一个数据字节的编号)才有效。因此,TCP规定,当链接建立之后,所有往来的报文里面的ACK都应该是1(事实上,也只有客户端发起的链接请求报文的ACK没有置1)。ACK是确定收到的字段,用来解决丢包的问题。

seq是干什么用的?

seq是包序号,用来解决包乱序的问题。



第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
tcp/ip 三/四次握手,四次挥手~

tcp/ip 三/四次握手,四次挥手~

tcp/ip 三/四次握手,四次挥手~tcp/ip 三/四次握手,四次挥手~



tcp/ip 三/四次握手,四次挥手~


tcp/ip 三/四次握手,四次挥手~



三次握手还是容易理解的。客户端发起一个连接,并置seq发送序号为X(随机?)。此为第一次握手。

服务端收到客户端的东东,然后回复客户端,我收到你发的东西了。并且发送一个确认序号ack(为X+1)给客户端。seq发送序号为Y.此为第二次握手。

此时客户端收到服务端的反馈,发送一个确认序号ack(为Y+1)+seq发送序号Z发送序号给服务器。此时发送完毕。完成第三次握手。