zoukankan      html  css  js  c++  java
  • 2.wireshark分析之TCP协议(一)

    (1) TCP是怎么样的协议?

          TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

    TCP的特点有:

    • TCP是面向连接的运输层协议
    • 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
    • TCP提供可靠交付的服务
    • TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
    • 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP应用程序交下来的数据仅仅是一连串的无结构的字节流。

    (2) TCP协议的由来?

         UDP协议非常简单,而且容易实现。但是其可靠性较差,一旦将数据包发出,将无法知道对方是否收到。为了解决这个问题,TCP协议就诞生了。使用TCP协议,可以提供网络的安全性。因为使用TCP协议传输数据时,每发出一个数据包都要求确认。如果其中有一个数据包丢失,就收不到确定包,发送方就知道应该重发这个数据包。这样TCP协议就保证了数据的安全性。

    (3)TCP三次握手

    位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

    Sequence number(顺序号码) Acknowledge number(确认号码)

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 

    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 

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

    通俗地讲:

    seq是序列号,这是为了连接以后传送数据用的,ack是对收到的数据包的确认,值是等待接收的数据包的序列号。

    在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

    seq是数据包本身的序列号;ack是期望对方继续发送的那个数据包的序列号。

    完成三次握手,客户端与服务器开始传送数据.

     

     (4)TCP的四次断开

    a.客户端通过发送一个设置了FIN和ACK标志的TCP数据包,告诉服务器通信已经完成

    b.服务器收到客户端的数据后,发送一个ACK数据包来响应客户端

    c.服务器再次向客户端传输一个自己的FIN/ACK数据包

    d.客户端手动啊服务器的FIN/ACK包后,响应服务器一个ACK数据包。然后结束通信。

     

    (5)为什么建立连接只需3步,而断开需要4步?

             答:   因为在客户端与服务器建立连接时,当收到客户端发送 的SYN数据后,是把ACK/SYN放在一起发送给客户端的。 但是当断开连接时,当收到客户端发送的FIN数据后,只能说明数据发送完毕,客户端不再发送数据,但是服务还是连接的。只能说明客户端没有数据发送给服务端了,但不代表服务端没有数据要发送给客户端了。当服务器所有的数据都发送完毕后,才会发送FIN/ACK数据,请求断开连接。

  • 相关阅读:
    dubbo 在不同协议下携带上下文区别
    innodb使用大字段text,blob的一些优化建议(转)
    Redis的过期策略和内存淘汰策略(转)
    在 Docker 里跑 Java,你必须知道的那些事儿!(转)
    如何在宿主机上执行容器里的jmap,jtack,jstat 命令获取信息(原创)
    操作系统实现线程的几种模式 和 java创建线程的3个方式
    MySQL数据库事务各隔离级别加锁情况--read committed && MVCC
    kafka性能调优(转)
    游戏数值系统
    lua函数回调技巧
  • 原文地址:https://www.cnblogs.com/lv6965/p/7706312.html
Copyright © 2011-2022 走看看