闲谈TCP协议




      首先 TCP/IP不是一个协议,而是一个协议族的统称,里面包括IP协议,IMCP协议,TCP协议等。而传输层最重要的就是TCP协议,相对于UDP协议,TCP是可靠的,可以处理乱序,重复的报文。而且它要保证所有的数据包都能够到达,所以必须要有重传机制。

       TCP的重传机制最基础的有两种:

1.超时重传机制:

   我们举个例子,比如我们在进行数据传输时,将1,2,3,4,5进行发送,这时1,2,4,5已经发送,但是这时3由于各种原因没能接收到,这时可以不回ack,一直等待3,当发送方发现收不到3的ack,超时后,就会对3进行重传。一旦接收到3后,ack就会回传5,意味着3,4,5都收到了。

      但是,这种情况就会出现一个问题,那就是需要死等3,就会导致接收方4和5已经收到了,但是发送方却不知道,因为没有收到ack,所以可能导致发送方认为后面的数据也全部丢失了,对后面的4,5都进行重新发送。

      对此有两种选择:

(1)仅重新传送timeout的包。也就是第3份数据包。

(2)重传timeout包后面的所有数据,也就是3,4,5这三份数据。

这两种方式也各有利弊:第一种会节省带宽,但是慢。第二种稍微快一点,但是会浪费带宽,而且浪费资源。这两种方法都不好的一面是都在等待超时时间也就是timeout,而timeout有可能会很长。

2.快速重传机制

    为了解决上述的问题就引入了快速重传机制,如果包没有连续到达,就ack最后那个丢到的包,如果发送方连续收到3次相同的ack,就进行重传,好处是不需要再等待timeout。

  比如:如果发送方发出了1,2,3,4,5份数据,第一份先到送了,于是就ack回2,结果2因为某些原因没收到,3到达了,于是还是ack回2, 后面的4和5都到了,但是还是ack回2,因为2还是没有收到,于是发送端收到了三个ack=2的确认,知道了2还没有到,于是就马上重转2。然后,接收 端收到了2,此时因为3,4,5都收到了,于是ack回6,表示前5个数据包都收到了。示意图如下:

闲谈TCP协议


而TCP/IP协议中最重要的则是进行链路初始化,建立链接(三次握手):

闲谈TCP协议

通俗的说3次握手就是:

 1.客户端对服务器说:我请求建立连接(发送一个SYN),我的序号是J。

 2.服务器收到之后对客户端说:我接收到了你的请求(这时J+1),服务器发送一个确认请求,我也同意建立连接(发送一个SYN),并向客户端发送一个序号K。

 3.客户端在接收到服务器发送的建立连接的请求之后,对服务器再次发送一个确认,并且K+1.

而TCP/IP协议中断开链接则是4次挥手:

闲谈TCP协议

1.在客户端在和服务器进行完数据传输后,客户端想要断开和服务器的连接,则对服务器说我要断开连接了,对服务器发送一个断开连接的标志(FIN)标志,客户端进入等待状态。

2.服务器接受到客户端的消息之后会对客户端进行回复:我已经知道你要关闭连接了(发送确认请求ack)。

3.客户端接收到服务器发送的确认之后,需要等待一段时间,因为服务器可能还有其他数据要进行传送。

4.在服务器发送完所有数据之后,对客户端进行说,我要关闭连接了(这时发送FIN请求,以及确认请求ack)。

5.客户端在接收到服务器发送的关闭连接的请求之后,对服务器发送一个确认请求ack(seq+1,ack+1),并且关闭连接,同时服务器也关闭连接。

  以上就是我对TCP/IP的一些简单的了解,希望能够帮助初学者理解TCP/IP协议中的一些基础知识。闲谈TCP协议闲谈TCP协议闲谈TCP协议