TCP

TCP/IP协议族

TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能。包含以下四个层次:

1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

2. 网络层,也称作互联网层,处理分组在网络中的活动,例如分组的选路。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。

3. 运输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协 议)。TCP为两台主机提供高可靠性的数据通信。他所作的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最 后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服 务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必须的可靠性必须由应用层来提供。

4. 应用层负责处理特定的应用程序细节。包括Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传送协议)以及SNMP(简单网络管理协议)等。

wireshark抓到的包与对应的协议层如下图所示:

1. Frame:   物理层的数据帧概况

2. Ethernet II: 数据链路层以太网帧头部信息

3. Internet Protocol Version 4: 互联网层IP包头部信息

4. Transmission Control Protocol:  传输层的数据段头部信息,此处是TCP

5. Hypertext Transfer Protocol:  应用层的信息,此处是HTTP协议

TCP协议

      TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。TCP报文是TCP层传输的数据单元(也叫报文段)。三次握手三个tcp包(header+data),TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。

  

1、端口号:用来标识同一台计算机的不同的应用进程。

  1)源端口:源端口和IP地址的作用是标识报文的返回地址。

  2)目的端口:端口指明接收方计算机上的应用程序接口。

  TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

2、序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

3、数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。

4、保留:为将来定义新的用途保留,现在一般置0。

5、控制位:URG  ACK  PSH  RST  SYN  FIN,共6个,每一个标志位表示一个控制功能。

  1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。

  2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

  3)PSH:push传送标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。

  4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

  5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。

  6)FIN:finish结束标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

6、窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。

7、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

8、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

9、选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

10、数据部分 TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

wireshark捕获到的TCP包中的每个字段如下图所示:

抓包分析三次握手过程

  • 百度百科的三次握手过程:
    • 第一次握手:建立连接时,客户端发送连接请求包到服务器,标志位SYN(同步序号)置为1,随机产生一个序号seq=X的值。并进入SYN SENT状态,等待服务器确认。
    • 第二次握手:服务器收到客户端发送的请求报文,由SYN=1知道客户端是要求建立联机。此时服务器向客户端发送一个SYN和ACK都置为1的TCP报文,设置自己的初始序号seq=Y,同时将确认序号设置为客户端序列号加1(ack=X+1)即SYN+ACK包。并将该数据包发送给Client以确认连接请求,此时服务器进入SYN RECV状态;
    • 第三次握手:客户端收到服务器的SYN+ACK包后检查确认序号是否正确(即第一次发送数据报序号加上1 X+1),并检查标志位ACK是否为1,如果正确将ACK标志位置为1、ack=Y+1并将该数据包发送给服务器,服务器会检查ack是否等于Y+1、ACK是否为1,如果正确则双方连接建立成功。客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手,随后客户端和服务器之间可以开始传输数据。

  • TCP包中的具体内容:(TCP包的具体内容图来源于博客:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html)
  • wireshark中的tcp三次握手过程:

  1)打开wireshark后,在浏览器输入访问地址:http://www.cnblogs.com/Chilam007/,wireshark自动捕获数据包,然后过滤自己需要分析的数据,这里是过滤与主机通信的记录,过滤规则为:ip.addr == 116.211.169.93  ,过滤后的数据如图1所示

                 图1(过滤后的数据包显示,注:这里不知道为什么数据包是重复的)

  • 574帧是客户端向服务器发送TCP请求建立连接。标识为SYN。

  • 619帧是服务器得到请求后向客户端回应确认包的过程。标识为SYN,ACK。
  • 620帧是客户端回应服务器发送确认包的过程,将于服务器建立连接。标识为ACK。

  • 663帧是客户端向服务器发送HTTP请求内容的过程。标识为GET。

  • 667帧是服务器响应客户端请求的过程,收到请求。标识为ACK。

  • 674帧是服务器向客户端回应内容的过程。

  2)TCP三次握手分析:第一次握手数据包,客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接,如图2所示

               图2(第一次握手)

 第二次握手的数据包,服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1,如图3所示

         图3(第二次握手) 

 第三次握手的数据包,客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1,如图4所示

  

          图4(第三次握手)

抓包分析四次挥手过程

      TCP断开连接时,会有四次挥手过程,由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

(1)第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号为X=1,确认序号为Z=1。Client进入FIN_WAIT_1状态。 

(2)第二次挥手:服务器收到FIN后,发送一个ACK给客户端(标志位ACK=1),确认序号为收到的序号加1(与SYN相同,一个FIN占用一个序号),即X=X+1=2。序号为收到的确认序号=Z。Server进入CLOSE_WAIT状态。

(3)第三次挥手:服务器发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。发送一个FIN中包含标志位FIN和ACK置为1,序号为Y=1,确认序号为X=2。

(4)第四次挥手:客户端收到服务器发送的FIN之后,进入TIME_WAIT状态,接着发送一个ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1=2,序号为收到的确认序号X=2。Server进入CLOSED状态,完成四次挥手

原文地址:https://www.cnblogs.com/hsmwlyl/p/10703946.html