005-TCP传输控制协议

一、概述

  传输控制协议(英语: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层称为Stream,数据分组称为分段(Segment)。作为比较,数据在IP层称为Datagram,数据分组称为分片(Fragment)。 UDP 中分组称为Message。

  数据帧(Frame):是一种信息单位,它的起始点和目的点都是数据链路层。
  数据包(Packet):也是一种信息单位,它的起始和目的地是网络层。
  数据报(Datagram):通常是指起始点和目的地都使用无连接网络服务的的网络层的信息单元。
  段(Segment):通常是指起始点和目的地都是传输层的信息单元。

  数据链路层的PDU叫做Frame(帧);
  网络层的PDU叫做Packet(数据包);
  TCP的叫做Segment(数据段);

二、TCP整体,三次握手,四次挥手

2.1、tcp/ip整体概述

  

  通过上图可以看到

  

2.2、TCP数据包结构

偏移 位0–3 4–7 8–15 16–31
0 来源连接端口 目的连接端口
32 序列号码【seq】
64 确认号码【ack】
96 报头长度 保留 标志符 窗口大小
128 校验和 紧急指针
160 选项字段
160/192+  
数据

2.3、详细概述

来源连接端口(16位长)-辨识发送连接端口

目的连接端口(16位长)-辨识接收连接端口

序列号(seq,32位长)

  如果含有同步化旗标(SYN),则此为最初的序列号;第一个数据比特的序列码为本序列号加一。
  如果没有同步化旗标(SYN),则此为第一个数据比特的序列码。

确认号(ack,32位长)—期望收到的数据的开始序列号。也即已经收到的数据的字节长度加1。

报头长度(4位长)—以4字节为单位计算出的数据段开始地址的偏移值。

保留—须置0

标志符

  URG—为1表示高优先级数据包,紧急指针字段有效。
  ACK—为1表示确认号字段有效
  PSH—为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
  RST—为1表示出现严重差错。可能需要重现创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
  SYN—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
  FIN—为1表示发送方没有数据要传输了,要求释放连接。

窗口(WIN,16位长)—表示从确认号开始,本报文的接受方可以接收的字节数,即接收窗口大小。用于流量控制。

校验和(Checksum,16位长)—对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。

紧急指针(16位长)—本报文段中的紧急数据的最后一个字节的序号。

选项字段—最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。

  0:选项表结束(1字节)
  1:无操作(1字节)用于选项字段之间的字边界对齐。
  2:最大报文段长度(4字节,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。
  3:窗口扩大因子(4字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
  4:sackOK—发送端支持并同意使用SACK选项。
  5:SACK实际工作的选项。
  8:时间戳(10字节,TCP Timestamps Option,TSopt)
  发送端的时间戳(Timestamp Value field,TSval,4字节)
  时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)

填充:  这是为了使整个首部长度是 4 字节的整数倍

其他选项:

  窗口扩大:  占 3 字节,其中有一个字节表示移位值 S.新的窗口值等于TCP 首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小

  时间戳:  占10 字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4字节)

  选择确认:  接收方收到了和前面的字节流不连续的两2字节.如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据

2.4、三个阶段

2.4.1、链接建立【三次握手】

  图解

    

  过程:    

    1》c-s:客户端A 的 TCP 向服务端 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x

      客户端进入SYN_SEND状态,等待服务器的确认;

    2》s-c:服务端B 的 TCP 收到连接请求报文段后,如同意,则发回确认(服务端B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x﹢1,自己选择的序号 seq = y)

      服务器进入SYN_RECV状态;

    3》c-s:客户端A 收到此报文段后向 服务端B 给出确认,其 ACK = 1,确认号 ack = y﹢1(客户端A 的 TCP 通知上层应用进程,连接已经建立,服务端B 的 TCP 收到客户端主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立)

      客户端和服务器端都进入ESTABLISHED状态

    至此完成三次握手,可以进入下一阶段

2.4.2、数据传送

2.4.3、连接释放【四次挥手】

  图解:

    

  步骤:

    tcp四次挥手,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。

    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。    

    1》客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)(A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认)

      主机A进入FIN_WAIT_1状态;这表示主机A没有数据要发送给主机B了;

    2》B 发出确认,确认号 ack = u+1,而这个报文段自己的序号 seq = v(TCP 服务器进程通知高层应用进程.从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态.B 若发送数据,A 仍要接收)

      主机A进入FIN_WAIT_2状态;主机B告诉主机A,我也没有数据要发送了,可以进行关闭连接了;

    3》主机B向主机A发送FIN报文段,请求关闭连接,同时主机B进入CLOSE_WAIT状态;若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接

    4》A 收到连接释放报文段后,必须发出确认,在确认报文段中 ACK = 1,确认号 ack=w﹢1,自己的序号 seq = u + 1

  TCP采用四次挥手关闭连接如图所示为什么建立连接协议三次握手,而关闭连接却是四次握手呢?

  这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

更多扩展:https://www.cnblogs.com/yueminghai/p/6646043.html

原文地址:https://www.cnblogs.com/bjlhx/p/8873138.html

时间: 2024-10-23 05:21:25

005-TCP传输控制协议的相关文章

TCP传输控制协议

TCP 在TCP/IP协议模型中, 传输层协议有TCP和UDP, 这里主要介绍下可靠传输TCP协议, 目前是传输层协议首选. 特点 面向数据流(字节流形式) 虚电路连接 有缓冲传输(提供push机制 ) 无结构数据流(无边界) 全双工 连接建立 socket接口使用 connect()时建立连接,  采用三次握手, 请看下图 : 在这个过程中完成了几个重要功能 : 建立连接, 做好传送数据准备. 协商各自报文段初始序号ISN( 任意选取, TCP准规定不可为1, 其中一个原因是避免IP欺骗).

TCP 传输控制协议

开头先说几个协议: IP:网际协议 TCP:传输控制协议 Http:超文本传输协议 AMQP:高级消息队列协议 一:TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. 首先来看看OSI的七层模型: 我们需要知道TCP工作在网络OSI的七层模型中的第四层——Transport层,IP在第三层——Network层,ARP在第二层——Data Link层: 在第二层上的数据,我们把它叫Frame,在第

第十七章 TCP传输控制协议

TCP的服务 TCP通过下列方式来提供可靠性: ? 应用数据被分割成 TCP认为最适合发送的数据块.这和 UDP完全不同,应用程序产生的数据报长度将保持不变.由 TCP传递给 IP的信息单位称为报文段或段( segment). ? 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段.如果不能 及时收到一个确认,将重发这个报文段. ? 当TCP收到发自 TCP连接另一端的数据,它将发送一个确认.这个确认不是立即发送,通常将推迟几分之一秒. ? TCP将保持它首部和数据的检验和.这

TCP/IP协议详解 卷一:协议 17章、TCP传输控制协议

1.TCP服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. (1)面向连接 两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接.过程与打电话相似,先拨号振铃,等待对方摘机说"喂",然后才说明是谁. 说明:在一个TCP连接中,仅有两方彼此进行通信.广播和多播不能用于TCP. (2)可靠性 TCP通过下列方式来提供可靠性: 1)应用数据被分割成TCP认为最适

《TCP/IP详解》读书笔记(17章)-TCP传输控制协议

1.TCP的服务 在一个TCP连接中,仅有两方进行彼此通信.TCP通过下列方式来提供可靠性: 1)应用数据被分割成TCP认为最适合发送的数据块.这和UDP完全不同,应用程序产生的数据报长度保持不变.由TCP传递给IP的信息单位称为报文段或段. 2)当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段.如果不能及时收到一个确认,将重发这个报文段,这将在21章中重传策略中讨论. 3)当TCP收到发自TCP连接另一端的数据,它将发送一个确认.这个确认不是立即发送,通过将推迟几分之一秒,

《TCP/IP详解卷2:实现》笔记--TCP:传输控制协议

传输控制协议,即TCP,是一种面向连接的传输协议,为两端的应用程序提供可靠的端到端数据流传输服务,它完全不同于 无连接的.提供不可靠数据传输服务的UDP协议. 下图描述了各TCP函数与其他内核函数之间的关系,带阴影的椭圆分别表示我们将要讨论的9个主要的TCP函数. 1.TCP的protosw结构 下图列出了TCPprotosw结构的成员变量,它定义了TCP协议与系统内其他协议之间的交互接口. 2.TCP的首部 tcphdr结构定义了tcp首部.下图给出了tcphdr结构的定义和TCP首部. 大多

传输控制协议TCP学习(一)

时间:2014.06.25 地点:基地 --------------------------------------------------------------------------------- 一.TCP服务 TCP位于应用层与网络层之间,提供介于应用程序和网络功能之间的服务.主要包括如下服务: 1.1进程到进程的通信 与UDP一样,TCP也使用端口号提供进程到进程的通信 1.2流交付服务 与UDP不一样,TCP是一种面向流的协议. UDP中,进程将已定义好边界的报文发给UDP以便进行

传输控制协议TCP

1.TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP是运输层的重要协议,运输层是位于IP层之上,应用层之下的中间层.应用层向运输层发送用于网间传输的.用8位字节表示的数据流,然后运输层把数据流分区成适当长度的报文段.之后运输层把结果包传给IP层,由它来通过网络将包传送给接收端实体的运输层.为了保证不发生丢包,给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收.然后接收端实体对

TCP:传输控制协议

概述: 书中采用了8章来介绍TCP,可见其重要性.TCP是一种面向连接的.可靠的字节流服务,也就是说两方要交换数据必须先建立一个连接. TCP的信息单位称为segment.TCP对字节流的内容不作任何解释,这项工作交给TCP连接双方的应用层去做. TCP为应用层提供全双工服务,即数据能在两个方向上独立地传输. TCP首部: TCP首部通常是20个字节加可选字段.它的前8位必须使源端口号和目的端口号,这是因为ICMP差错至少会返回除了IP首部外的前8个字节,这样方便检查差错对应于哪个连接.MSS为

17.TCP:传输控制协议

TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用在彼此交换数据之前必须先建立一个TCP连接.在一个TCP连接中,仅有两方进行彼此通信.广播和多播不能用于TCP. TCP通过下列方式来提供可靠性: 1. 应用数据被分割成 原文地址:https://www.cnblogs.com/i-hard-working/p/10703765.html