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
关于如何做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功能。
- Reliability
TCP协议设计的标准就是要足够可靠,要保证segment 在损坏,丢失,重复三种情况下都足够可靠。
如果segment在传送的过程中损坏了,那么TCP提供了一个checksum机制来保证segment能被检测出来是不完整的,然后丢弃该segment进行重传。
TCP给每个segment都打上了一个32位的seq号,这个seq初始值随机,每传输一个字节,下一个seq号就增加一,seq号可以用来分辨一个segment是否重复传送 了。TCP同时还要求接收方在接收了一次之后要返回一个ACK给传送方,如果在一定时间内没有返回一个ACK,那么传送方就当作这个包已经丢失。由此解决包的丢失问题。
- Flow Control
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的拥塞控制在此之外还有不少的更新,具体的方法接下来会单独写文章阐述,就不在这里展开。
- Multiplexing
一个台Host上可能会有多个应用想要使用TCP连接,但一个TCP连接会被(发送方IP,接收方IP)唯一确定。也就是说每个应用都会拿到同一个TCP连接,而TCP连接是有状态的,多个应用使用一个连接,这显然是不可接受的,TCP协议无法被复用。
为了解决这个问题,TCP引入了端口的概念,通过(发送方IP:端口,接收方IP:端口)这样来确定一个TCP连接,这样一来每个应用就都有自己本身的TCP连接了。
- Connection
如同上文提到,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。
- Precedence and Security
TCP提供优先级选项。
网友评论