您的位置:首页 > 理论基础 > 计算机网络

TCP详解(1):简介与数据包

2015-07-15 14:45 537 查看
简介:

  传输控制协议(英语:Transmission Control Protocol, TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。

  

  


  

  在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像渠道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

  应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  TCP的连接并不是指一条实际的或虚拟的链路存在于数据交换的两端,而是指连接的双方都维护了一些资源(如输入输出缓冲区、多种定时器)以及链路状态的信息,并通过双方的控制报文交互管理状态、向用户提供接口修改这些资源的分配。

  TCP提供了可靠的数据传输服务,其采取的措施是对控制报文和数据报文进行确认、并在超时之后进行重传;并利用滑动窗口协议解决数据数传乱序、收发双方进行流量控制。具体来说就是,对于发送方,TCP按照其认为最合适的长度发送数据报文,并在发出报文之后,启动一个定时器,等待数据的确认报文,若定时器超时后仍没有收到确认报文,则重传该报文;对于接收方,收到数据后,首先检查报文校验和,错误则直接丢弃该报文,不确认(发送端会注意到这个事实,从而重传);收到重复报文,丢弃,不确认;通过双方维护的滑动窗口,TCP会将乱序报文排好序后才提交给上层应用程序。

  需要注意的是,流量控制与拥塞控制并不是同一回事,流量控制的目的在于防止发送端发送大量数据,超过接收端的处理能力,从而导致丢包等;拥塞控制则在于防止网络中发生拥堵,中间路由器或交换机丢弃报文的情况。

  TCP提供数据流服务,上层应用传给TCP的数据,TCP并不加以区分,仅仅是按照自己的需求组合、拆分数据,然后传送给对端,对端TCP协议栈再将数据以发送的顺序递交给上层应用。TCP的数据传送仍然是以IP报文的方式发送到对端的,每次尽力发送MSS大小的报文,Nagle算法、TCP_CORK等都是为了对流中报文进行控制。

  TCP本身并不提供报文边界之类的东西,但提供了紧急数据、PUSH标志(并没有提供对外接口)等方式可以模拟报文。通常,TCP数据流的划分是应用程序的事,应用程序定义好格式,并自己解析。

数据包结构:

  在TCP首部的图中,我们主要关注以下几个字段:序号、首部长度、6个标志位、选项,窗口大小、紧急指针都是以字节单位,这里并不关注。

  不含选项的TCP首部为20字节,在首部选项中指明了首部有多少个4字节,由于其占了4位,因此首部最多为60字节。

  序号字段用来标识TCP数据流中的数据字节流,在建立连接时会以一个ISN进行初始化,每个SYN、FIN等都会消耗掉一个序号。我们并不用太关心这个字段,只是需要知道序号为32位,在长肥管道(容量较大的网络中)序号可能会出现回绕,TCP需要识别。TCP对该字段也进行了相应的扩充(增加选项)。

  

  


  注意上图中的四个非常重要的东西:

  Sequence Number:包的序号,用来解决网络包乱序(reordering)问题。

  Acknowledgement Number:ACK序号——用于确认收到,用来解决不丢包的问题。

  Window:又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流量控制。

  Control Bits:包的类型,主要是用于控制TCP的状态机。

  TCP首部中定义了6个字段,在一个报文中,通常只会出现一个标志,但也允许多个标志同时出现。

  URG:紧急指针标志位。

  ACK:确认序号标志位,关于ACK有几点需要注意:a) ACK是累积的,表示接收方已经正确收到了一直到确认序号减一的所有字节;b) TCP通常并不会对每个数据包进行确认,而是采用了捎带确认和延迟确认的技术,捎带确认是指将ACK报文合并到数据报文中去,而延迟确认是TCP维持了一个200ms的定时器,在定时器过期前,若有多个数据需要确认,则一块进行确认,通常是两个报文确认一次,若200ms到了,仍没有新数据需要确认,则不再等待,直接确认该报文;c) ACK报文本身并不会被确认,当ACK丢失时,需要依靠对端超时机制发现(后文详述)。

  PSH:该标志由TCP自动设置(曾经允许通过接口进行设置,当前多数实现不提供),多数实现在发送者将清空发送缓冲区时设置该标志,即发送者一次将当前发送缓冲区的数据都发送出去了。

  RST:连接重置标志位。

  SYN:同步标志位,用来发起一个新建连接。

  FIN:发送端已经完成了所有的数据发送,不会再发送新的数据,关闭了其发送端,若对端也发送该标志,则完全关闭连接。

其他:

  


参考:

https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE

technet.microsoft.com

http://www.tcpipguide.com/free/t_TCPConnectionTermination-4.htm

http://www.kuqin.com/shuoit/20141018/342719.html

http://nmap.org/book/tcpip-ref.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: