TCP/IP协议

TCP/IP

  • TCP/IP协议其实是一系列与互联网向关联的协议集合起来的总成。
  • 分层管理是TCP/IP协议的重要特征;

TCP/IP协议族分层

  • TCP/IP协议族是有一个四层协议组成的系统,这四层分别为:应用层,传输层,网络层和数据链路层;

TCP/IP协议

  • 应用层:应用层一般是我们编写的应用程序决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。如FTP,DNS,HTTP等;
  • 传输层:传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。在传输层有两个性质不同的协议:TCP,UDP;
  • 网络层:网路层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方;
  • 链路层:链路层用来处理连接网络的硬件部分,包括控制操作系统,硬件设备驱动,NIC(Network Interface Controller,网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。

数据包的封装过程

  • 传输层及其以下的机制由内核提供,应用层由用户进程提供,应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示:
    TCP/IP协议
  • 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。

TCP数据报格式

TCP/IP协议

  • 端口号

    • 标记同一台计算机上的不同进程
    • 源端口:占2个字节,源端口和IP的作用是标记报文的返回地址。
    • 目的端口:占2个字节,指明接收方计算机上的应用程序接口。
    • TCP报头中的源端口号和目的端口号同IP报头中的源IP和目的IP唯一确定一条TCP连接。
  • 序号

    • 占4个字节,是TCP可靠传输的关键部分。是本报文段发送的数据组的第一个字节的序号。
    • 在TCP传输流中,每一个字节一个序号。(例如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400.)所以序号确保了TCP传输的有序性。
  • 确认序号

    • 即ack,占4个字节,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK=1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
  • 数据偏移

    • 占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远。
    • 由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任选子段时长度为20字节;4位首部长度字段所能表示的最大值为1111,转化为10进制为15,故报头最大长度为15*32/8=60个字节。首部长度也叫数据偏移。
  • 保留

    • 为将来定义新的用途保留,一般置为0。
  • 控制位

    • URG:紧急指针标志。1:紧急指针有效;0:忽略紧急指针。
    • ACK:确认序号标志。1:确认号有效;0:忽略确认号段。
    • PSH:push标志。1:带有push标志的数据,表示接收方在接收到该报文后应尽快将这个报文段交给应用程序,而不是缓冲区排队。
    • RST:重置连接标志。用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
    • SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
      FIN:结束标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
  • 窗口

    • 滑动窗口大小,用来告知发送端接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是2个字节,因而窗口大小最大为65536。
  • 校验和

    • 奇偶校验,此校验和是针对整个TCP报文段的,包括TCP报头和TCP报文数据段,以2个字节进行计算所得。由发送端计算和存储,并由接收端进行验证。
  • 紧急指针

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

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

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

IP数据报格式

TCP/IP协议

TCP三次握手

TCP/IP协议

  • 第一次握手:客户端发送带有SYN标志的连接请求报文段,然后进入SYN_SENT状态,等待服务端的确认;
  • 第二次握手:服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述信息放到一个报文段(SYN+ACK)中,一并发给客户端此时服务端将进入SYN_RECV状态;
  • 第三次握手:客户端收到服务端的SYN+ACK报文段后,会向服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务的都进入ESTABLISHED状态,完成TCP三次握手。

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

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

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

TCP四次挥手

TCP/IP协议

  • 第一次挥手:主机一(可以是客户端也可以是服务器端),设置seq=u,向主机二发送一个FIN报文段;此时,主机一进入FIN_WAIT_1状态;表示要断开连接;
  • 第二次挥手:主机二接收到了主机一发送的FIN报文段,向主机一回一个ACK报文段,表示已经收到断开请求。回复时,随机生成一个序列号 SEQ=v。ACK字段在主机一发来断开TCP连接请求序列号SEQ=u的基础上加 1,得到 ACK=u+1
  • 第三次挥手:主机二在回复完主机一的 TCP 断开请求后,不会马上进行 TCP 连接的断开。主机二会先确认断开前,所有传输到主机一的数据是否已经传输完毕。确认数据传输完毕后才进行断开,向主机一发送 [FIN,ACK] 报文,设置字段值为 1。再次随机生成一个序列号 SEQ=w。ACK 依然为u+1;
  • 第四次挥手:主机一收到主机二发送的FIN报文段,向主机二发送ACK报文段,生成一个序列号 SEQ=u+1。 ACK 字段的值在主机二发来断开 TCP 连接请求序列号 SEQ=w 的基础上加 1,得到 ACK=w+1,然后主机一进入TIME_WAIT状态;主机二收到主机一的ACK报文段以后,就关闭连接;此时,主机一等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那么,主机一也可以关闭连接了。

2MSL

  • TIME_WAIT状态也成为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。

  • 对一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。

  • 这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用。

上一篇:工信部郑昕:中小企业信息化要把握云计算契机


下一篇:ROS建图后第二次规划路径时无法显示costmap的解决办法