浅谈TCP/IP模型之传输层

传输层

传输层是TCP/IP模型中最核心的一层,它负责在网络层(IP层)的基础上提供额外特性,使得数据可以准确的传递给某一个具体的应用,因此传输层协议提供了如下的功能:

  • 为网络应用程序的接口:负责源计算机向目的计算机的特定应用传输数据。

  • 多路复用/多路分解机制:多路复用表示从不同应用程序接收数据,在把数据传递到目的计算机。多路分解表示在计算机接收端,可以将接收到的数据传递给多个网络程序,比如浏览器、文件共享应用程序。

  • 错误检测、流量控制和验证:确保发送端和接收端之间数据传输的正确性。

  • 传输控制协议TCP:提供完善的错误检测、流量控制,确保数据正确传递,是一个面向连接的协议。

  • 用户数据报协议UDP:只提供基本错误检查,是一个无连接的协议。

基本概念

面向连接的协议:通过网络传输的每一个数据包都会有一个确认,发送端会记录确认信息保证每一个数据包都被正确的接收,否则会重发数据,知道被准确的接收。

无连接协议:以单向方式传递数据报,接收端不需要向发送端返回确认信息,因此不保证数据的传递可靠性。

我以打电话作为一个例子:
A:”B,你能听到我吗?”;
B:“A,我听到你了,你能听到我吗?”
A:“B,我听到你了。”
然后AB之间开始类似上面的通话,这就是面向连接的协议,就像使用对讲机通话,需要向对方返回确认信息。
A:“B,我跟你说点事情,。。。。。。。。。”
这就是无连接的协议,A根本不知道B有没有听到他说话的内容,就像村长在广播里通知村民干活一样。

端口和嵌套字

端口:
传输层把网络应用和网络数据串联了起来,把网络数据传递给特定的应用程序。在TCP/IP系统中,端口是一个预定的内部地址,用来表示计算机上特定的应用程序。以快递作为例子,如果说快递上的收货地址指的是IP地址,那么收件人则就是端口号。如果没有端口号,虽然收获地址是正确的,如XX市XX小区XX室,但是如果没有填写正确的收获人则快递员也就不知道快递属于哪一位顾客。
嵌套字:
嵌套字则就是IP地址和端口的组成,例如111.222.333.444.21指向IP地址为111.222.333.444的计算机上端口号为21的应用程序。


理解TCP

上面已经介绍了TCP使用面向连接的方式进行通信息,除此之外还包括了一些特性:

  • 面向流:TCP可以一个字节一个字节的接收数据,而不是一次接收预定大小的数据块。
  • 重新排序:TCP可以将以错误的顺序栓地传递的数据重新排列为正确的顺序再进行传输。
  • 流量控制:确保传递的数据不会超出目标计算机接收范围。
  • 优先级和安全:TCP可以设置连接的优先级和安全级别。
  • 适当的关闭:TCP确保安全的关闭连接,确保数据不会丢失。

TCP数据格式

TCP数据格式如下:
浅谈TCP/IP模型之传输层

  • 序号:当前TCP数据报数据部分的第一个字节的序号。TCP是面向字节的,它会对发送的每一个字节进行编号,而且不同数据报之间是连续编号的。 序号占了32位,所以可以给[0,2^32-1]个字节进行编号,当发送完2^32-1个字节后,序号又从0开始。

  • 确认号:表示当前主机作为接收端时,期望接收的下一个字节的编号是多少。 也表示,当前主机已经正确接收的最后一个字节序号+1

  • 数据偏移(报文长度):它表明了数据报头部的长度。

  • 保留字段:为以后TCP发展留下空间,现在都是0.

  • 标识符:TCP有7种标识符,用于表示TCP报文的性质。它们只能为0或1。

    • URG=1:当URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有效。
    • ACK=1:ACK被置1后确认号字段才有效。 此外,TCP规定,在连接建立后传送的所有报文段都必须把ACK置1。
    • PSH=1 :当接收方收到PSH=1的报文后,会立即将数据交付给应用程序,而不会等到缓冲区满后再提交。
    • RST=1 :当该值为1时,表示当前TCP连接出现严重问题,必须要释放重连。
    • SYN=1 :SYN在建立连接时使用。 当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。 当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。
    • FIN=1 :FIN=1表示此报文段是一个释放连接的请求报文。
  • 接收窗口大小:该字段用于实现TCP的流量控制。 发送方不需要等待每一个数据段被确认以后才发送下一个数据段,允许已经确认接收的序号和正在发送的序号有一定差别。
    浅谈TCP/IP模型之传输层
  • 检验和:用于接收端检验整个数据包在传输过程中是否出错。

  • 紧急指针:用于标识紧急数据的尾部。

  • 选项字段:上述字段都是每个TCP头部必须要有的,而选项字段是可选的,且长度可变,最长40字节。 最常用的选项字段为MMS:最大报文长度。

TCP连接

一般来说,为了保证TCP连接的可靠性和效率,连接时需要三步。当然,也可以设置为四步或者更改多,虽然可靠性提高了,但是降低了效率;如果使用两步,虽然效率提高了,但是可靠性又减少了。所以,三步是折衷的方式,俗称三次握手。过程如下:

浅谈TCP/IP模型之传输层

  • 第一次握手:SYN=1表示请求连接,Seq=x表示本次通信的初始***。第一次握手目的是建立客户端到服务端的连接。此时客户端状态Closed→SYN-SENT

  • 第二次握手:SYN=1表示请求服务端到客户端的连接,ACK=1表示你第一次握手的请求我已经收到了。确认好ack=x+1表示你接下来应该发送序号以x+1开始的数据,Seq=Y表示服务端本次通信的初始***。此时服务端状态LISTEN→SYN-RCVD

    • PS:这一次通新是把确认和请求两个步骤合为一次通信。
  • 第三次握手:SYN=0表示连接已经建立了,ACK=1表示收到了二次握手的请求,ack=Y+1表示服务端下一个数据是***为Y+1开始的数据。Seq=Z表示本次客户端发送的数据初始***。此时客户端转状态SYN-SENT→ESTABLISH,接收到第三次握手后,服务端状态SYN-RCVD→ESTABLISH

经过这三次握手,客户端和服务端的TCP连接已经建立了。

三次握手变为两次握手可以嘛?

不可以,如果去掉第三次握手,那么服务端会收不到确认信息,从而不知道第二次握手是否成功,此时服务端会再次重新请求第二次握手,这样服务端一直处于请求第二次握手阶段。

三次握手变为四次握手可以嘛?
可以,其实三次握手中的第二次握手,是把请求连接和返回确认两个步骤合二为一了,如果将其分开,就是四次握手,就是请求-确认-请求-确认,但是四次握手的效率不如三次握手。如果只考虑数据传递的安全,我们可以进行五次、六次或者更多次的握手。

TCP断开

当TCP需要断开连接时,为了保证数据的正确传输,防止数据的丢失,两台计算机的TCP需要进行四次通信,也就是我们俗称的“四次挥手”。
具体过程如下:
浅谈TCP/IP模型之传输层

  • 第一次挥手:FIN=1表示客户端A没有数据要传给服务端B了,请求关闭A→B的连接。seq=u表示A发送给B的最后一个序号。发送完以后,A进入FIN-WAIT-1状态。此阶段主要是关闭A→B的连接。

  • 第二次挥手:ACK=1表示接受到了A的关闭请求,Seq=v表示发送的***,ack=u+1表示接收到了A传送过来的u之前的数据***。此时B状态变为CLOSE-WAIT。此阶段主要是B发送确认信息,确认A到B的数据连接关闭,但是B还可以继续发送数据给A。

  • 第三次挥手:FIN=1表示B到A的数据传输完成,申请断开连接,ACK=1,seq=w表示B发送给A的最后一个***,ack=u+1表示成功接收u之前的数据。此时B状态变为LAST-ACK,此阶段是B请求关闭B→A的连接。

  • 第四次挥手:ACK=1表示A收到了关闭连接的请求,ack=w+1表示成功收到了B发送的w序号之间的数据。此时A进入TIME-WAIT,等待2毫秒以后转为CLOSED,B收到A发出的第四次挥手以后直接进入CLOSED。之所以有2毫秒的等待是为了如果A发送第四次挥手失败,可以再次重发;如果直接关闭,并且A发送的第四次挥手失败了,那么B就永远不可能关闭连接

理解UDP

UDP比TCP简单的多,首先UDP具有有限的错误校验功能(并不是没有),UDP数据报中包含校验和,接收端可以根据校验和来确定数据是否完整。其次,UDP没有提供像TCP那样的重新排序功能。所以,UDP的特点是面向无连接的、不可靠的、效率高、面向报文的(不处理数据,只是在数据前加上头)。

UDP的头包含四个16位字段,如下图:

浅谈TCP/IP模型之传输层

  • 源端口:表示数据发送端使用的UDP端口,这个字段是可选的,因为UDP是面向无连接的,所以只负责把数据传输到目标端口即可,不需要目标端口的响应。

  • 目的端口:接收端计算机上UDP程序的端口。

  • 长度:表示UDP数据报和UDP数据载荷的长度,因为UDP报头为8字节,所以这个值最小是8.

  • 校验和:用来校验数据在传输过程中是否完整。

  • -

TCP可靠性实现原理

TCP是通过校验和、***、确认答应、控制重发、窗口控制等实现可靠性的。

  • 通过***、确认答应:当发送端传输数据到接收端以后,会返回一个确认答应和***,表示接收到了数据,确认***表示接收到的数据的下一个值,也就是告诉发送端接下来应该发送哪些数据。
    浅谈TCP/IP模型之传输层

  • 控制重发:当A没有收到B的确认答应时,那么A认为B很大几率没有接收到数据,于是会再次发送上一次的数据,直到收到B的确认答应。
    浅谈TCP/IP模型之传输层

  • 窗口控制:如果TCP执行每发一次数据进行一次确认答应的处理,那么通信的性能会很低,就是数据的吞吐量会很差。
    浅谈TCP/IP模型之传输层
    于是TCP引入了窗口的概念,发送端发送完数据以后不需要马上进行确认答应的处理,而是继续发送数据,而窗口的大小就是不需要进行确认答应而继续发送数据的量的大小,一旦超过这个量,发送端就会惊醒答应确认处理。
    浅谈TCP/IP模型之传输层
    可以知道,上图中窗口大小为4000。