Core CS

TCP详解 Part 1 Operations(RFC笔记)

2020-04-13  本文已影响0人  不动点P

As noted above, the primary purpose of the TCP is to provide reliable, securable logical circuit or connection service between pairs of processes. To provide this service on top of a less reliable internet communication system requires facilities in the following areas:

  • Basic Data Transfer
  • Reliability
  • Flow Control
  • Multiplexing
  • Connections
  • Precedence and Security

这几个点是TCP设计的时候的核心要素,可以说TCP协议就是围绕着这几个问题来设计的。

关于如何做Basic Data Transfer, TCP这里采用的是把TCP做成 a continuous stream of octets(字节),当然由于底层协议的限制,TCP不能直接一个字节一个字节的发送,这个stream是通过把一定的字节包装成segment 来完成的。

值得注意的是,TCP协议是由自身来控制什么时候传输接受的,这在socket编程里体现为你发送方调用了好几个send,我接收方一个recv就可能把消息全部收到了。这是因为发送方前面几个send的数据并没有发送出去,而是挤压在tcp的window里一起送。也就是所谓的 “粘包问题”。严谨一点的话粘包问题不是存在于TCP层,而是应用层设计的问题,设计者把TCP这种stream协议当成datagram协议来用。

但是有些时候你必须确定自己某些包通过tcp送出去了。 TCP还针对这种情况提供了一个push功能。

TCP协议设计的标准就是要足够可靠,要保证segment 在损坏,丢失,重复三种情况下都足够可靠。

如果segment在传送的过程中损坏了,那么TCP提供了一个checksum机制来保证segment能被检测出来是不完整的,然后丢弃该segment进行重传。

TCP给每个segment都打上了一个32位的seq号,这个seq初始值随机,每传输一个字节,下一个seq号就增加一,seq号可以用来分辨一个segment是否重复传送 了。TCP同时还要求接收方在接收了一次之后要返回一个ACK给传送方,如果在一定时间内没有返回一个ACK,那么传送方就当作这个包已经丢失。由此解决包的丢失问题。

TCP提供了一个 让接收方能够控制传送方的传送速率的方法。

This is achieved by returning a "window" with every ACK indicating a range of acceptable sequence numbers beyond the last segment successfully received.

TCP的拥塞控制在此之外还有不少的更新,具体的方法接下来会单独写文章阐述,就不在这里展开。

一个台Host上可能会有多个应用想要使用TCP连接,但一个TCP连接会被(发送方IP,接收方IP)唯一确定。也就是说每个应用都会拿到同一个TCP连接,而TCP连接是有状态的,多个应用使用一个连接,这显然是不可接受的,TCP协议无法被复用。

为了解决这个问题,TCP引入了端口的概念,通过(发送方IP:端口,接收方IP:端口)这样来确定一个TCP连接,这样一来每个应用就都有自己本身的TCP连接了。

如同上文提到,TCP协议使用的时候要维护一些关于本身的变量,比如checksum等,接收方还要提供一个"window",所以TCP一次连接可以看作一个有状态的Connection。

TCP在使用之前必须要先建立连接,使用完后要terminate or close连接。这里两个词意义不一样,terminate表示双方面的close,而close指一方调用close,无论如何,只要有一方调用,那么这个connection已经不存在了。

在建立连接之前TCP还引入了一个shakehand机制来避免Connection不正常的建立,这也就是我们常说的三次握手。要注意的是,这里的三次握手使用的seq不是每传一个字节就+1的seq号,三次握手的seq的含义和正常TCP connection的seq含义不一样,是clock-based。

TCP提供优先级选项。

上一篇下一篇

猜你喜欢

热点阅读