一.TCP协议简介
TCP是TCP/IP体系中非常复杂的一个协议,TCP最主要的特点有:
1.TCP是面向连接的运输层协议。应用程序在使用TCP协议之前,必须先建立TCP连接。在传递数据完毕后,必须释放已建立的TCP连接。
2.每一条TCP连接只能有两个端点,只能说点对点的。
3.TCP提供可靠交付的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。
4.TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
5.面向字节流。TCP中的“流”指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。
TCP报文段先要传到IP层,加上IP首部后,再传送到数据链路层。再加上数据链路层的首部和尾部,才离开主机发送到物理链路。
a.TCP和UDP在发送报文时所采用的方式完全不同。TCP并不关心应用程序一次把多长的报文发送到TCP缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用程序给出的)。
b.如果应用程序传送到TCP缓存的数据块太大,TCP就可以把它划分短一些再传。TCP也可以等待积累有足够多的字节后再构建成报文段发送出去。
二:TCP包头格式
TCP协议重定解决的问题:
顺序问题,稳重不乱;丢包问题,承诺靠谱;连接维护,有始有终;流量控制,把握分寸;拥塞控制,知进知退。
TCP把连接作为最基本的抽象,每个TCP连接有两个端点。TCP连接的端口叫做套接字,端口号拼接到IP地址即构成了套接字(如:192.3.4.5:80)。
1.源端口号和目标端口号是不可少的,这一点和UDP是一样的,如果没有这两个端口号,数据就不知道应该发送给哪个应用。
2.包的序号:为了解决乱序的问题
3.确认序号:发出去的包应该有确认,如果没有收到就应该重新发送,直到送达,这个可以解决不丢包的问题
4.状态位:ACK是回复,RST是重新连接,FIN是结束连接。
三:TCP连接三次握手
1.一开始,客户端和服务端都处于CLOSED状态
2.先是服务端主动监听某个端口,处于LISTEN状态
3.客户端主动发起连接SYN,之后处于SYN-SENT状态
4.服务端收到发起的连接,返回SYN,并且ACK客户端的SYN,之后处于SYN-RCVD状态
5.客户端收到服务端发送的SYN和ACK之后,发送ACK的ACK,之后处于ESTABLISHED状态。
6.服务端收到ACK的ACK之后,处于ESTABLISHED状态。
四:TCP连接释放四次挥手
1.当前A和B都处于ESTAB-LISHED状态。
2.A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。
3.B收到连接释放报文段后即发出确认,然后B进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时TCP连接处于半关闭状态,即A已经没有数据发送了。
从B到A这个方向的连接并未关闭,这个状态可能会持续一些时间。
4.A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文端。
5.若B已经没有向A发送的数据,B发出连接释放信号,这时B进入LAST-ACK(最后确认)状态等待A的确认。
6.A再收到B的连接释放消息后,必须对此发出确认,然后进入TIME-WAIT(时间等待)状态。请注意,现在TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入CLOSED状态。
7。B收到A发出的确认消息后,进入CLOSED状态。
五:TCP状态机
一.以字节为单位的滑动窗口
在TCP里,接收端(B)会给发送端(A)报一个窗口的大小,叫Advertised window。
1.在没有收到B的确认情况下,A可以连续把窗口内的数据都发送出去。凡是已经发送过的数据,在
未收到确认之前都必须暂时保留,以便在超时重传时使用。
2.发送窗口里面的序号表示允许发送的序号。显然,窗口越大,发送方就可以在收到对方确认之前连续
发送更多数据,因而可能获得更高的传输效率。但接收方必须来得及处理这些收到的数据。
3.发送窗口后沿的后面部分表示已发送且已收到确认。这些数据显然不需要再保留了。
4.发送窗口前沿的前面部分表示不允许发送的,应为接收方都没有为这部分数据保留临时存放的缓存空间。
5.发送窗口后沿的变化情况有两种:不动(没有收到新的确认)和前移(收到了新的确认)
6.发送窗口前沿的变化情况有两种:不断向前移或可能不动(没收到新的确认)
二.超时重传时间的选择
TCP的发送方在规定时间内没有收到确认就要重传已发送的报文段。这种重传的概念很简单,但重传时间的选择
确是TCP最复杂的问题之一。TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间
这两个时间之差就是报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间。超时重传时间RTO略大于加权平均往返时间。
三:选择确认SACK
如果收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据?
答案是可以的,选择确认就是一种可行的处理方法。
如果要使用选项确认SACK,那么在建立TCP连接时,就要在TCP首部的选项中加上“允许SACK”的选项,而双方必须都事先商定好。如果使用选择确认,
那么原来首部中的“确认号字段”的用法仍然不变。SACK文档并没有明确发送方应当怎么响应SACK.因此大多数的实现还是重传所有未被确认的数据块。
四:TCP的流量控制
一般说来,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,接收方就可能来不及接收,这会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
五:TCP的拥塞控制
在计算机网络中的链路容量,交换节点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能
就要变坏。这种情况就叫做拥塞。
拥塞控制方法:
1.慢开始和拥塞避免
2.快重传和快恢复
3.随机早期检测
本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-09/154367.htm