客户端和服务器 ,双方都处于第一次交互的情况下展开通信  

三次握手

    1.首先 服务器 需要是处于listen收听状态下才能接受报文 客户端由closed状态 打开并向服务器发送报文 SYN=1 申请建立联机 seq=a (这里的seq的顺序号也就是tcp包头的序号,如果双方通信次数)           2.第二步: 服务器B返回信息 ACK=1 已收到确认 并向A也发送一个包请求通讯 seq=b1 ack确认号也要+1 (这里为什么要+1 是因为B已经收到了ack包 如果你再发的话需要你发 ack+1的包) 而大写的ACK是确认号 表示前面f发过来的那个包 或者字段是否有效。当ACK=1时,前面的确认号字段才有效。0则无效 这时候服务器和客户端都处于SYN-RCVD状态 (同步收到)       3.第三步:客户端返回服务器 首先大写的ACK=1 确认有效性 这时候 客户端A要再给服务器B发的包的话。seq的顺序号就要+1了 也就是seq=a+1 并且在给服务器B返回ack=y+1 也就是告诉b你上一个ack=y的包我已经收到了 再发的话需要你发 y+1的包   这时候服务器和客户端的状态都处于ESTAB-LISHED(已建立连接状态)  

 

4.之后 客户端a和服务器b就可以进行正常的数据传送了

         

四次挥手

  还是 A客户端 B服务器 一般都是客户端对服务器发起请求断开链接 当然 服务端也可以向客户端发起断开链接的请求 (用客户端向服务器提出断开链接 举例子)

  当需要断开链接的时候

    第一步: 客户端A 对服务器B发出 FIN=1 的数据包(FIN(finish结束)) seq=u 包的序号 并且客户端的状态从建立链接 ESTAAB-LISHED状态切换到 FINWAIT-1终止等待状态 seq=u 序号为u的包      第二步: 服务器返回ACK(acknowledgement 确认) 确认接收到 断开链接的包了 返回ack=u+1 并告知客户端。你的上一个包已经收到。下次再发请发ack=u+1的包 并且。返回的给客户端的报头编号为 seq=v ack=u+1

服务器的状态变更为close-wait 关闭等待

客户端接收到第二步的包时 客户端的状态立即切换到 FIN-WAIT2 终止等待2的状态

     第三步: 由于客户端已经对服务器发起了断开链接请求。也就是客户端已经没有数据向服务器发送了。。 但是服务器可能还有数据没有对客户端传送完毕。 当服务器对客户端的数据传送完毕之后 会对客户端在发起新的数据报文 FIN=1 确认关闭 ACK=1 seq=w 序列号 (这里的为什么不是V+1 因为 第三步和第四部之间 服务器会给客户端传送剩余的数据,所以这里的seq编号。就变很多了,暂且用w表示 而不是 seq=v+1) ack=u+1 确认 客户端的状态变更为 last-ack 最后确认 状态      第四步: 当客户端收到了 第三步的包 立即回应 并确认 断开链接 ACK=1 seq=u+1 ack=w+1 并且客户端的状态 切换到 time-wait 时间等待 状态 (由于网络的情况或许有延迟,丢包等情况,有可能会出现 数据还没传送完毕。但是服务端的确认断开链接的报头先到了。。 为了保证接收到了所有数据。客户端会等待一段时间,等待2MSL (1))

    

第五步: 服务器当收到客户端的第四步回应的报头 直接就处于closed 关闭状态了

客户端需要 等待2MSL后 才会进行closed关闭状态

   

补充: MSL是什么;aximum Segment Lifetime 报文的最大生命时间。何报文在网络上存在的最长时间,超过这个时间报文将被丢弃

      

有限状态机FSM:Finite State Machine

  CLOSED 没有任何连接状态 LISTEN 侦听状态,等待来自远方TCP端口的连接请求 SYN-SENT 在发送连接请求后,等待对方确认 SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认 ESTABLISHED 代表传输连接建立,双方进入数据传送状态 FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认 FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭 传输连接请求 TIME-WAIT 完成双向传输连接关闭,等待所有分组消失 CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认 LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失 CLOSING 双方同时尝试关闭传输连接,等待对方确认

          

TCP包头

  URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效   ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。 TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段   PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空 间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序 不将接收到的数据读走,就会一直停留在TCP接收缓冲区中   RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必 须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应, 带RST标志的TCP报文段称为复位报文段   SYN:在建立连接时使用 用来同步序号。当SYN=1,ACK=0时 表示这是一个请求建立连 接的报文段当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求 建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文 段称为同步报文段   FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方: “我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段