网络基础 TCP协议(报文解析)

来源:互联网 发布:数控切割机套料软件 编辑:程序博客网 时间:2024/05/21 06:57
网络基础 TCP协议(报文解析)
(一) TCP/ UDP区别
  TCP:传输控制协议
       TCP与UDP都是属于传输层协议,尽管使用同样的网络层IP协议,但是两者之间有很大的区别。TCP是一种面向连接的协议,提供的是一种面向连接的、提供可靠地字节流服务。
      TCP在正式收发数据前,必须要和对方建立可靠的连接(必须要经过三次“握手”才能建立起连接)。由于TCP是面向连接的协议,也就意味着TCP应用不能应用与多播和组播。
      UDP则是面向非连接的协议,它不能与对方建立连接,而是直接把数据包发送过去,UDP适用于一次性传送少量的数据,对可靠性要求不高的应用环境。正因为UDP协议没有连接过程,所以通信速度快。所以在业务中,选择TCP还是UDP作为传输协议,完全取决于具体的业务需求。
       
(二) TCP可靠性的策略
  1. 数据被分割为TCP认为合适的块进行传输
  2.当TCP发送一个数据报之后,将启动一个定时器,等待目标确认这个数据报,如果不能得到确认,将重发这个数据报。TCP提供了一系列的超时和重发策略。
  3. TCP将保持伪首部、首部与数据的校验和(具体参考checksum算法),这是一个端到端的校验和。如果校验和出错,则接受端会丢弃这个数据,并不回送确认报文(发送端将在超时后重发)。
  4. TCP采用IP协议作为网络层,IP数据报有可能乱序传送,如有必要,TCP将对IP数据报进行重新排序。
  5. IP数据报可能会发送重复,TCP端能够丢弃重复的数据。
  6. TCP收到一个数据报时,并不立即发送确认报文,通常将推迟几十毫秒再发送。
  7. TCP提供了流量控制的策略


(三) TCP的报文格式详解
     3.1 TCP报文格式
     下图给出了TCP的报文格式(图片来源于网络)。有时一个IP地址和一个端口号也被称之为套接字(socket)。套接字对(socket pair)可以唯一的确定互联网中的双方连接关系。
         
   
  •      32位序号:指出段中数据在发送端数据流中的位置。用来标志从TCP发送端向TCP接收端发送的字节流,表示这个报文的第一个数据字节,如果把TCP看做是两个应用程序间的数据单项流动,则TCP用需要对每个字节进行计数,溢出后从0开始。
  •      32位确认序号:用于接收端通知发送端希望得到的下一个字节数,在此之前的字节已经接收完毕。确认需要在ACK标志位1时,有效。TCP提供全双工服务,数据在两个方向上独立传输,所以连接的每一端要保持每个方向上的传输序号。
  •      首部长度:指出以32bit为单位的字长度。 它是针对变长“选项”设计的。4位首部长度,最大值为15个字,即首部最大长度为64个字节。
  •      URG:紧急指针字段可用
  •      ACK:确认字段可用
  •      PSH:本报文段请求紧急操作
  •      RST:连接复位(首先断开连接,然后重新连接)
  •      SYN:序号同步,用于建立连接中的同步(该标志仅仅在三次握手建立TCP时有效)
  •      FIN:发送方字节流结束(该标志仅在结束TCP连接时有效。0表示结束连接请求、 1表示结束连接)
  •      窗口(滑动窗口):用于通知接收端接收缓冲区的大小,提供流量控制。
     3.2 URG与PSH介绍   
      如果发送方希望终止操作,不想接收方接收完所有的数据(如远程主机上的程序错误时就需要这种信号)。TCP此时将数据指定为“紧急”型,接收方收到这种数据后,会不必排队而尽快通知应用程序。URG为1,则表示它是紧急的,其中“紧急指针”指出了紧急数据在报文段中的结束位置。
      PSH位提供了数据强迫传输机制,以强迫传输当前流中的收时,不必等待缓冲区满,直接通知应用层完成数据交付,因为一般来说TCP需要等内核缓冲区填满后再通知应用层。而URG是不需要经过缓冲区的。

     3.3 滑动窗口
   所谓的滑动窗口,表示接受端的实际接收能力,用以限制发送方的发送速度。窗口起始位置为确认号字段指明的值,这个值是接收端根据自身实际缓冲希望接收的字节数。窗口大小最大为65535个字节(16bit)。
     TCP可以表述为没有选择确认或否认的滑动窗口协议TCP缺少选择确认,因为TCP首部的确认序号表示接收方已成功收到的字节后,希望得到的连续的下一个字节。例如:1~1024字节已经收到,下一段报文中包含从2049~3072到的字节,接收端并不能确认这个新的报文,只是发回一个确认序号为1025ACK。如果接受到1025~2048的报文,但是检验和错,TCP也只是发回一个确认序号为1025ACK

   分析下图所示的滑动窗口刻度,说出起始序号、发送窗口、报文段长度分别为多少?
  
  
      由图可知,前一个窗口的值是400,发送了1-400长度的报文,之后收到1-200的报文并更新了滑动窗口(确认中,窗口值为500),此时窗口向前滑动200个长度(从1的位置滑到200),且窗口范围扩大100。
      起始序号为401,发送窗口长度为500,报文段长度为300(从401到700)。
      窗口内可以发送报文的内容为401-700,201-400之前已经发送,在等待被确认或者重传。

(四) UDP的报文格式
      UDP报文格式如下:
   
   
      UDP目的端口:接收数据时,UDP要判断此目的端口是否与当前使用的端口匹配,如是,则将数据报放入相应的接收队列,否则,抛弃该数据并向信源端口发送“端口不可达”的差错消息报文。
      报文长度:以字节计算的整个报文长度,最小为8个字节,只有报头
      校验位:为了效率,该值是一个可选项


    正如博文标题所述,仅仅作为入门的内容。TCP涉及的流量控制、阻塞控制也是非常值得研究的~~
    推荐一篇流量控制、阻塞控制的科普文章:
    TCP滑动窗口机制 http://blog.csdn.net/whygosofar/article/details/5582965


   

 
0 0
原创粉丝点击