TCP属于传输层的协议。

传输层的作用是什么?传输层实现端到端的连接,端到端是什么概念呢?打个比方说,一个人用QQ与朋友聊天,网络层识别IP地址,能够将信息送到正确的主机,而主机应该使用什么应用协议接收这个信息呢? 这个功能就需要传输层来完成,传输层实现进程到进程的连接。

传输层的重点:  1、传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;  2、包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议);  3、重要设备:网关。

IP地址是标识网络中不同主机的地址,而端口号就是同一台主机上标识不同进程的地址,IP地址和端口号合起来标识网络中唯一的进程。

3.4.1 网络连接的时间

TCP建立连接,根据网络环境不同,使用的时间如下:

1、本机的话,通信内容直接走内存。

2、局域网走网卡,然后通过交换机,指定到相应主机。tcp建立3次握手,一般耗0.6毫秒左右。

3、外网通过网卡->路由器->互联网。

计算机网络学习笔记-TCP与UDP

 

3.4.2 TCP的首部

TCP是一个面向连接的服务,也就是说在数据通信之前,发送端与接收端要先建立连接。等数据发送结束后,双方再断开连接。

TCP首部数据结构

计算机网络学习笔记-TCP与UDP

◇0~15这16位称为源端口号;它是TCP数据段发送方进程对应的端口号,这个端口号是由发送方进程产生的随机数,它唯一地标识了发送端的一个进程。

 

◇16~31这16位是目标端口号,它对应的是接收端的进程,接收端收到数据段后,根据这个端口号来确定把数据送给哪个应用程序的进程。这样才能保证数据到达正确的地方。否则,发给A程序的数据有可能被送给B程序,那么整个数据传输秩序就会变得很混乱。

 

◇第2行是32位的***,它提供0~2^32-1范围内的一个数字。TCP从应用程序取得数据后,会根据实际传输能力把数据划分成不同的数据段。TCP用这个数字来给数据段打上标记,当数据到达目的地后,接收端会按照这个***把数据重新排列,保证数据的正确性。

 

◇第3行是32位的确认***,它提供0~2^32-1范围内的一个数字。被分成许多数据段的数据虽然被做了标记,但并不能保证这当中的所有段都会到达目的地。然而对接收端来讲,只要有一个段没有接收到,就不能保证数据的正确性。使用确认号可以很好地解决这个问题。确认号是对发送端的确认信息,用它来告诉发送端这个序号之前的数据段都收到了,比如确认号是X,就是表示前X-1个数据段都收到了。如果一个数据段一直没有被确认,它将会被要求重发。这样数据的完整性就得到了保证。

 

◇第4行分为4个部分。

  第1部分是4位首部长度,用它可以确定首部数据结构的字节长度。一般情况下TCP首部是20个字节,但当要扩展首部长度大小时可以使用这个字段,比如把这4个位都置为1就得到TCP首部长度的最大值60。4位的最大值是1111换算成十进制是l5,表示首部长度为l5行。而每行数据有32位即4个字节长,所以首部长度为15×4=60。

 第2部分是6个保留位。这部分保留位作为今后扩展功能用,现在还没有使用到。

第3部分是6个控制位。这6位有很重要的作用,TCP的连接、传输和断开都是受这6个控制位的指挥。各位含义如下:

  URG紧急指针有效位,它和第5行的16位紧急指针配合使用,当URG=1时,TCP根据16位紧急指针确定紧急数据的最后一个字节的位置。这样接收端就可以优先准确快速

地获取紧急数据,确保紧急数据的即时到达。

  ACK只有当ACK=1时确认***字段才有效。当ACK=0时,确认号无效。

  PSH标志位为1时要求接收方尽快将数据段送达应用层,这个标志位是为了加快特殊数据的处理速度。

RST值为1时通知重新建立TCP连接。

SYN同步序号位。TCP需要建立连接时将这个位置为1。

FIN发端完成发送任务位,当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个位置为1。

·第4部分是1 6位的窗口大小,它说明本地可接收数据段的数目,这个值的大小是可变的,当网络通畅时这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP协议中的流量控制机制就是依靠变化窗口的大小实现的。

◇第5行中的16位校验和是用来做差错控制的,在发送TCP数据段时,由发送端计算TCP数据段所有字节的校验和。当到达目的地时又进行一次校验和计算。若这两次的校验和一致则说明数据基本是正确的。否则将认为该数据已被破坏,接收端将抛弃该数据。

◇第5行中的16位紧急指针和URG配合使用,当URG=1时有效。用来说明紧急数据的末尾字节的位置。

◇第6行是可选项,只有当4位首部长度大于20时才有效,那时TCP的首部中会附加更多的信息,一般情况下没有可选项。

◇第7行是数据,它是由应用层的数据分段而得到的一部分数据,是TCP协议服务的对象。在传输前TCP协议会给这部分数据加上一个序号,来表示这个部分数据在数据整体中的位置。

 一个TCP连接不仅需要端口,还需要IP地址来确定通信的主机。故而IP首部中的发送端IP地址加上发送端端口号就形成了连接的发送端;目标端IP地址再加上接收端端口号

就确定了连接的接收端。这样就唯一地确定了一个TCP连接。

  在TCP/IP协议中,TCP协议是基于IP协议的。IP协议是对应于网络层的协议,它是一个不可靠的协议。TCP协议的可靠性保证给IP协议提供了可靠环境,从而使得IP协议可以不必考虑传输的可靠性,专注于网络层的功能。这也是协议分层的初衷。TCP被认为是一种流式传输层服务。它表示TCP发送端从应用程序接收到字符流,并从这个流中提取适当的长度创建数据段,然后将其发送到网络上。TCP接收端则接收数据段,从中提取数据,若没有按序号到达还要对其进行排序,并将其作为字符流交付给接收端应用程序。这样就完成了数据的传输。

  为了进行流式交付,发送TCP和接收TCP都要利用缓冲。发送TCP使用发送缓冲来存储从发送应用程序截取的数据。发送应用程序交付数据的速率是它产生数据的速率。例如,在使用网络登录、控制远程主机时,用户在键盘上输入的数据就是逐个字符地交付给TCP的发送端的。

3.4.3 TCP建立连接

  TCP在建立连接的时候使用端口号来完成与应用程序的对应。当一台计算机和其他计算机进行连接、通信时使用IP地址和端口号。连接的每一方都是由一个IP地址和一个端口号组成的。比如通过IE浏览器上网时,通过解析输入的URL地址可以得到IP地址,这时还有一个隐含的端口号80。这样就构成了连接的服务器方。同样,连接的客户端也会有自己的IP地址和端口号。

  在计算机上可以通过命令netstat -n来查看目前存在的连接进程。TCP建立连接的过程称为3次握手。建立连接的过程如图所示。

计算机网络学习笔记-TCP与UDP 

◇第1次握手是主机A通过将一个含有“同步***”(SYN)标志位的数据段发送给主机B而开始请求连接。通过该数据段,主机A告知主机B两点:主机A希望建立连接请求,主机B应答;主机A告诉主机B使用哪个***作为数据传输时数据段的起始号。

◇第2次握手是主机B用一个带有“确认应答”(ACK)和“同步***”(SYN)标志位的数据段响应主机A。它也有两个目的:发送ACK通知主机A收到了数据段;通知A从哪个***开始给数据段做标记。

◇第3次握手是主机A再次发送一个数据段,确认收到了主机B的数据段,并可以开始传送实际数据。

◇这样3次握手就全部完成了,数据将开始传输。

   3次握手有如下特点:

◇没有应用层数据。

◇SYN这个标志位只有TCP建立连接时才被置为1。

◇握手完成后SYN标志位被置为0。

3.4.4 TCP断开连接

TCP建立一个连接时进行了3次握手,而终止一个连接要经过4次。这是由TCP的半关闭(half-close)造成的。

什么是TCP的半关闭呢? 因为一个TCP连接是全双工的(即数据可在两个方向上同时传递),所以进行关闭时每个方向必须单独地进行关闭。这个单方向的关闭都称为半关闭。关闭的方法是一方完成它的数据发送任务后,就发送一个FIN来向另一方通告将要终止这个方向连接。当一端收到一个FIN,它必须通知应用层TCP连接已经终止了那个方向的数据传送。发送FIN通常是应用层进行关闭的结果。

TCP的断开要经过4步,但后两步和前两步很相似,只是关闭连接的双方调换角色而已。

  (1)TCP连接的一端A将控制位FIN置为1,提出停止TCP连接的请求。

(2)对端B收到FIN后对其做出响应,确认这一方向上的TCP连接将关闭。

(3)由B端再提出反方向的关闭要求,将FIN置为1。

(4)由A端对B提出的关闭做出应答,双方向的关闭结束。

这样一共经过4个步骤后,TCP全双工的双向连接都得到了正常的关闭。其关闭过程如图所示。

计算机网络学习笔记-TCP与UDP

◇在数据传输阶段,主机A向主机B发送了***为100的数据段,主机B接收到后,发送了***为300、确认号为10l的确认数据段。这时,主机A与B之间已经完成了数据的传输。

◇主机A主动断开连接,向主机B发送***为101的数据段,其中将FIN标志位置为1,同时,确认前一个B发送来的数据段,确认号为301,并将ACK置1。

◇主机B接收到这个断连请求后,发送***为301、确认号为102的确认数据段,执行被动关闭。这时,完成了A→B的半关闭。

 ◇接着主机B向A发出了***为301、FIN置1的断连请求,要求断开B→A方向的连接。

◇主机A收到这个FIN,应答了一个确认号为302的确认序列,执行被动关闭。这时,完成了TCP的断开连接的工作。

-----------------------------------------------------------------------------提示:在图中标出的第3步,主机B发送的断连请求中,***、确认号与上一个数据段相同。

3.4.5 TCP的流控机制

为了解决发送与接收双方数据通信能力存在差异而带来的数据丢失问题,TCP引入了流量控制机制。TcP使用滑动窗口来实现流量控制,下图显示了滑动窗口的工作原理。

计算机网络学习笔记-TCP与UDP

  ◇在TCP建立连接的时候,主机A与B之间就进行了窗口大小的协商,主机A在发送连接建立请求的时候,就向主机B通告了自己发送窗口的大小,单位是字节(在本例中,为了讲解简单,使用简单的数字来举例)。

 ◇主机B缓冲区的大小为3,因此B向A发送确认的时候,宣告窗口大小为3。

 ◇主机A再次确认后,连接已经建立,开始发送数据。

 ◇主机A发送了3个数据段,主机B接收到数据后,缓冲区由空变为满,这时,应用程序读取了1个数据段,为缓冲区清空了大小为l的空间。

◇主机B向A确认收到的数据,并根据缓冲区空间的大小宣告窗口为l。如果B的缓冲区大小为O,B会向A宣告窗口大小为0,如果A接收到B窗口大小为0的确认,A会停止发送,等待B宣告一个非O的窗口时再发送数据。

 ◇主机A根据B宣告的窗口大小来发送数据。

3.4.6  TCP的拥塞控制

在TCP中,发送方要维护两个窗口来解决拥塞问题,一是接收方允许的窗口,二是拥塞窗口(cwnd),这两个窗口的最小值将是发送方可以发送的窗口大小。下图显示了TCP的拥塞控制。 

计算机网络学习笔记-TCP与UDP

◇主机A与主机B在建立连接时协商了窗口的大小为3。

◇主机A向B发送了3个数据段。

◇主机B只接收到一个数据段,发送了确认号为102的确认。

◇在重传计时器超时前(关于超时计时器的内容,在后面会有详细的讲解),主机A没有收到来自B的确认,A认为数据段102和103丢失。

◇主机A根据接收到的确认将拥塞窗口cwnd减小。

3.4.7  TCP的应用

   TCP在网络中的应用范围很广,主要用在对于数据传输可靠性要求高的环境,比如远程登录程序TELNET。这时,客户端发出的每个命令都要在远程主机上执行,那么就希望数据的传输是可靠的。如果有不可靠的数据到达了,希望能让发送端再发送一次,从而提高可靠性。还有大家熟悉的网页浏览,它使用的HTTP协议就是依赖TCP提供可靠性的。在使用TCP协议时,通信方对数据的可靠性要求高,即使因此降低了一点数据传输率也是可以接受的。

  这样的例子很多。下面将列出一些常用的端口号及其功能。以便进一步对TCP进行检测和管理。表列出了常用的TCP端口及应用。

计算机网络学习笔记-TCP与UDP

3.5 UDP协议

TCP协议的数据传输比较可靠,但因此而付出的代价在某些时候显得不太合适。比如主机A想要给主机B发送一句话“你好”,这个数据传输仅仅为4个字节而已。但用TCP协议来封装、传输它,至少要加上一个20个字节的首部,还要为此建立一个3次握手的连接。并且在数据传输完毕后还要进行4次断开。这样看来似乎对于一些简短的数据传输可以设计一种简单的传输协议。忽略一些可靠性考虑,提高数据传输率。在这种背景下,传输层的另一个协议UDP产生了。

 3.5.1 UDP的封装

  UDP是一个简单的面向数据包的传输层协议,进程的每个输出操作都恰好产生一个UDP数据段,并组装成一份待发送的IP数据包。UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,似乎应该避免使用UDP而使用一种可靠的协议如TCP。可是在小数据文件的传输中,UDP发挥了重要的作用。例如,当发送一个1O字节的短消息时;使用TCP和UDP都可以。可是TCP会加上至少20字节的头部数据,而且还要使用确认,这样数据的传输效率就较低。如果使用UDP则要加上的首部就缩减到8字节,并且没有确认。这

就使得数据传输率大幅度提高。当然,这样提高效率付出的代价是数据传输的可靠性得不到保障。可见使用何种传输协议还要具体问题具体分析。

UDP首部数据帧格式:

计算机网络学习笔记-TCP与UDP

   第一行0~15位是源端口号,用来标识数据发送端的进程,这和TCP协议的

源端口号类似。16~31位是目标端口号,用来标识数据接收端的进程,这里的作用也可参照TCP协议中的讲解。

   第二行0~15位是16位的UDP长度,它来指出UDP数据段中所包含数据的大

小,通过这个值可以准确地计算出数据的结束位置。16~31位是16位UDP校验和,用来完成对UDP数据的差错检验,这是UDP协议提供的唯一的可靠机制,它通过计算校验和来简单判断一下到达数据的正确性,这一点保证使得UDP的实用性大为增加。UDP的校验和是可选的。

图中第三行是数据,它来自应用程序,它的大小可由16位的UDP长度减去UDP首部长度后得到。

3.5.2 UDP的应用

UDP协议由于其自身的特殊性——能高速地传输数据,因而在实际工作中应用范围也很广,而且在某些方面有着TCP协议不可比拟的优势。同时由于UDP协议的特点,也使传输层在处理数据传输的时候有更多的选择。可以根据数据传输过程中的要求和数据本身的特点选择,对于可靠性要求高的数据传输选择TCP方式;对于传输率高要求的数据传输使用UDP方式。二者相辅相成使得传输层的功能更完善。在互联网逐步进入到千家万户的今天,大家可能对QQ这个聊天工具不陌生。很多人接触网络就是从上网聊天开始的。QQ这个应用软件在处理发送短消息时就是使用了UDP的方式。大家不难想象,发送十几个字或几十个字的短消息使用TCP协议进行一系列的验证将导致传输率的大大下降。有谁愿意用一个“反应迟钝”的软件进行网络聊天呢?实际上大家在使用QQ的时候也不会感到数据传输的不可靠。在网络飞速发展的今天,网络技术日新月异,对于常用的简单数据传输来说,UDP不失为一个很好的选择。在网络服务中也有用到UDP协议的,比如DNS服务。

UDP使用的常用端口:

计算机网络学习笔记-TCP与UDP

DNS服务器支持TCP和UDP两种协议的查询方式,而且端口都是53。大多数的查询都是UDP查询的,一般需要TCP查询的有两种情况。

◇当查询数据较大以至于产生了数据分段,这时,需要利用TCP的分片能力来进行数据传输。 

 ◇当主(master)服务器和辅(slave)服务器之间进行数据同步通信的时候。

UDP作为一个很小的不可靠的传输层协议,它没有流控机制,当来到的报文太多时,接收端可能会溢出。

除校验和外,UDP也没有差错控制机制,这就表示发送端并不知道数据是丢失了还是重复交付了。当接收端使用校验和检测出差错时,就会悄悄地将此用户数据丢掉。

以上是整合了几篇博客的内容,算是转载的

相关文章:

  • 2021-11-27
  • 2018-08-21
  • 2021-08-13
  • 2021-12-17
  • 2022-01-18
  • 2021-09-19
  • 2021-07-30
  • 2021-11-27
猜你喜欢
  • 2021-10-25
  • 2021-09-24
  • 2021-10-25
  • 2021-11-06
  • 2021-12-14
  • 2021-11-12
  • 2022-01-11
相关资源
相似解决方案