一 TCP协议简介(这篇博文之后会修改,现在先打个提纲)
TCp协议的特点
- 是面向连接的。应用程序在使用TCP协议时,必须进行连接;当然,数据传输结束后,要断开TCP连接。
- TCP连接是点对点的。
- TCP连接时可靠的。也就是说传输的数据时无差错的、不丢失、不重复、有序到达的。
- 是全双工的。即TCP连接的两端都设有发送缓存和接收缓存,用来存放双向通信的数据。
- 是面向字节流的。也就是说TCP将应用程序交下来的数据看成仅仅是一连串的无结构的字节流,其不知道这些字节流的具体含义。TCP协议无法保证发送的数据块的具体大小,因为TCP协议的发送的数据大小受到对方给出的窗口值和当前的网络拥塞度的影响。
TCP的连接端点是套接字。套接字是IP地址拼接上端口号组成的,即点分方式的十进制后面是端口号,中间用逗号或冒号隔开。如下方式:
1 | 套接字Socket=(IP地址:端口号) |
TCP报文段的首部
TCP协议的首部有20字节的固定长度,以及4N字节的变长段,因此TCP报文段首部最小为20字节。其格式如下:
分别占用两个字节的源端口和目的端口。
序号。占用4个字节。序号是循环的,当增加到最大值后又回到0。TCP是面向字节流的,这样会个发送的数据按顺序给每个字节编上号。在建立连接时,会指出发送的字节流的起始序号。首部中的序号表示发送的报文段的数据的第一个字节的序号,而报文的给字节的序号是顺序的。如第一个字节为401,报文的数据长度为100,则首部的序号为401,最后一个字节的序号为500,也就是说下一个报文的首部序号为501。
确认号。占用4个字节。表示期望收到下一个报文段的第一个数据字节的序号,也是下一个报文段的首部序号。如:B收到了A的200个字节数据的TCP报文段,而这个TCP报文段的首部序号为601,则B希望收到的下一个报文段确认号为801。也可以说如果确认号为N,则前面N-1为止的数据已经收到。
数据偏移。占用4位。其表示数据起始位置相对于报文段起始的位置的偏移量,也就是报文段首部的长度。其单位为32位字,也就是说其表示的值应该乘上4个字节。如:该字段的值为4,则其报文段首部长度为16个字节。其最大值只能表示15,也就是说报文段的首部最大只能为60个字节(即变长只能为20个字节)。其最小值为5,因为首部最小值为20。
保留。占用6位。其值设为0。
紧急URG。其占用1位。如果URG设为1,表示首部中的紧急指针有效。表示其发送的报文段数据有紧急数据,其需要马上发送出去(也就是取得最高优先权),TCP会将紧急数据插入到该报文的最前端,后面任然为普通数据。
确认ACK。占用1位。当ACK=1时,表示首部中确认号字段有效,为0时,确认号字段无效。TCP规定,在连接建立后ACK字段必须为1。
推送PSH。占用1位。两个应用程序通信,有时应用程序希望键入一个命令马上能够得到对方回应,这是就可以使用这个字段。将PSH设为1,TCP会马上建立一个报文将其发送出去。接收端在收到该报文后,会尽快的将其交给应用程序,不用得到缓冲区满。
复位RST。占用1位。当RST=1时,表示连接出现严重错误,需要释放连接,然后重新进行连接。其还用于拒绝打开一个连接或拒绝非法报文。
同步SYN。占用1位。用于在连接建立时同步序号。当SYN=而ACK=0时,表示这是一个连接请求报文段。当SYN=1且ACK=1时,表示对方接收建立连接报文段。因此SYN=1,表示这是一个连接请求或连接接受报文段。
终止FIN。占用1位。当FIN=1时,表示发送方的数据发送完毕,并要求释放连接。
窗口。占用2个字节。表示发送该报文段的一方的接收窗口,表示允许对方发送的数据量。窗口值告诉对方:从报文段首部中的确认好算起,接收方目前允许对方发送的数据量。如:确认为801,窗口值为1000,则表示其还有接收1000个字节数据(801-1800)的接收缓存空间。
检验和。占2个字节。其也和UDP一样需要加上伪首部,但是其中的17会变为6。
紧急指针。占用2个字节。当URG=1时有效,其指出了紧急数据在报文端中的末尾位置。紧急数据在报文数据段的开始。
选项。可选,最大为40个字节。包括MSS、窗口扩大、时间戳、选择确认等。
可靠传输
停止等待协议,连续ARQ协议,滑动窗口机制(重点)。(每一条数据都必须有确认回复,否则则超时重传)
流量控制
通过流量控制,可以让发送窗口的发送速率不要太快,流量控制是通过滑动窗口来实现的,其需要用来TCP报文中的窗口字段,该字段会用于标识接收端接收窗口的接收能力,用于设定发送窗口的大小。
解决发送时机的三个机制:
- 设置一个变量,它等于最大报文段长度,这要缓存的数据达到MSS字节时,就发送出去。
- 由发送方的应用程序指明要求发送报文段,通过报文的PUH字段来实现。
- 给发送方设计一个计时器,达到该事件,就将数据发送出去(不能超过MSS)。
Nagle算法:若应用程序将数据逐个字节传送给TCP发送缓冲区,则TCP将第一个字节数据组装成一个报文发送出去。只有当收到该确认报文后,才将缓冲区的所有数据组装成一个报文发送出去。只有收到前一个报文确认才发送下一个报文。Nage算法还规定:当缓冲区的数据已达到发送缓冲区一般或超过报文最大长度时,就立即发送一个报文段。
为了解决糊涂窗口综合症,可以让接受端等待一段时间、或者让接受缓存已有足够空间容纳一个最长报文段,或者等到接收缓冲已有一半空闲的空间,满足其一,就发送确认报文。
拥塞控制
发送方会有一个拥塞窗口,用于和接收窗口一起控制发送窗口的大小。发送窗口的大小取拥塞窗口和接收窗口中值较小的一个。
门阀值。
慢开始算法:拥塞窗口的大小从1开始逐渐增加增加到一倍。
拥塞避免算法:当执行慢开始算法时,拥塞窗口大于门阀值时,拥塞窗口的大小每次加一。
不管是慢开始算法还是拥塞避免算法,当出现拥塞时(即没有按时收到确认),就将门阀值减半,拥塞窗口在变为1执行慢开始算法。
快重传算法:是指接收方每收到一个失序的报文时,就发送一次重复确认(确认值为前面按序到达的报文最后一个数据值加1)。当发送方累计收到3次重复确认时,就立即再次发送未被确认的报文,而不必等待计时器到期在发送。
快恢复算法:是指到收到上次重复确认时,就立即将门阀值减半,并执行拥塞避免算法,起始值为门阀值或门阀值+3*MSS。