`
zhangziyangup
  • 浏览: 1066061 次
文章分类
社区版块
存档分类
最新评论

TCP讲解(1)----------摘自《计算机网络-自顶向下方法》

 
阅读更多

TCP连接是点对点,也就是,单个发送方和接收方的连接。TCP的连接被称为“三次握手”。第一次,由客户端发送一个特殊的TCP报文段,去请求服务端,第二次,由服务器也用一个特殊的TCP报文段来响应,第三次,客户端再用报文段来响应,其中就承载着“有效载荷”。在进程的套接字下面分别有TCP发送缓存和接收缓存,每个数据都分成报文段在这两个缓存间传输。

在TCP报文段中,包括了源端口号和目的端口号,至于IP地址会在运输层的下一层,网络层里加上去。其中TCP报文段还包括了序号,确认号,接收窗口,首部长度,互联网检验和,紧急数据指针。我接下来介绍其中的一些。

TCP的检验和字段和UDP是一样的,取反码。然后检验的时候和原码相加,只要有一个0就说明了数据包损坏。

其中的序号和确认号字段,就是在可靠数据传输服务中使用的。是TCP报文段中最重要的字段。其中序号用来标识每个传出去的字节流,一个序号对应一个字节。确认号字段是另一端期待的数据的下一个字节的序号。类似,客户端发了个报文段,里面的序号就是这个报文段数据字段首字节的序号,比如‘10‘,然后确认号就是服务端希望下一个接收的数据的下一个字节序号,比如’30‘。接着服务器端收到,如果成功接收后,那么服务端就发送报文段发送的报文的序号就是’11‘,确认号是’31‘。

TCP中,只确认数据流中至第一个丢失字节为止的字节,所以TCP被称为是提供累计确认。所以TCP有个状态变量sendbase,是最早未被确认的字节的序号,(Sendbase - 1是接收方已正确接收的的数据的最后一个字节的序号)。然后发送方接收到接收方传来的确认报文段的值,将它与sendbase比较,由于TCP是累计确认,所以y表示在y之前的字节都接收到了,所以如果y大于sendbase,则把sendbase设置为y。

接下来说下TCP的流量控制,因为如果发送方的发送速率大,而接收方速率小,就会有阻塞,导致有溢出的可能性,TCP让发送方维护一个发送窗口的变量来提供流量控制,用RcvWindow表示窗口大小,这个窗口的大小应该是接收缓存的大小减去了最后一个接收到的字节与最后一个读取的字节的差。然后发送方得确保最后一个发送与最后一个确认的字节的差小于了RcvWindow的大小。当窗口为0(接收缓存满了,还没清空缓存)时,还是要发送一个一字节的数据,这样,当接收缓存满了的时候,还能主机还能发送数据。

先讲到这,可能说的不是很清楚,希望有啥看不懂的或者不赞同的,多多提些意见,一起讨论,一起进步。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics