TCP----传输控制协议
传输层
是一种面向连接的可靠传输协议。可靠、有序、无丢失和无重复
特点:
-
TCP是一种面向连接的传输协议
-
每一条TCP连接有且只能存在两个端点,形成一种端到端的连接形式。
-
可靠、有序、无丢失和无重复
-
TCP是提供全双工通讯。
-
发送缓存
-
想要发送的应用层数据
-
已经发送但未收到确认的数据
-
-
接收缓存
-
按需到达但还未被应用程序提取的数据
-
乱序到达的数据
-
-
-
TCP是面向字节流的。
<span style="background-color:#f8f8f8"><span style="color:#333333">源IP、源端口、目IP、目端口----->TCP会话的四元组信息。
套接字:IP:Port</span></span>
确认序列号表明是接收方期望收到发送方发送的下一个字节的序号;且表示之前的所有数据均已接收。-->累积确认。
<span style="background-color:#f8f8f8"><span style="color:#333333">ACK确认位:当ACK=1时,确认序列号有意义。在连接建立后所有传输的报文段都必须将该标记位置为1。
SYN同步位:代表连接请求。
FIN终止位:表明此报文段发送方数据已发送完毕,要求释放连接。
RST复位:当TCP连接出现严重错误时,必须释放连接,然后重新建立传输连接。
URG紧急位:当URG=1时,表明此报文段中存在紧急数据,是高优先级数据,应尽快传输给应用层程序处理,不再缓存在排队。配合紧急指针使用。
PSH推送位:当PSH=1时,接收方应尽快交付数据给应用层程序,不再等待缓存填满再向上交付。</span></span>
TCP的可靠性
排序机制
<span style="background-color:#f8f8f8"><span style="color:#333333">MTU---最大传输单元
MSS---最大段长度----TCP分段--->该参数是需要在TCP建立握手过程中通过前两次SYN报文段来进行协商确定。</span></span>
如果在本地进行了分段操作,则不需要进行分片操作。
确认机制和重传机制
<span style="background-color:#f8f8f8"><span style="color:#333333">RTT---往返时间
RTO---超时重传时间;略大于RTT时间--->动态变化的数值。加倍的形式进行变化。</span></span>
超时重传---快速重传
在快速重传机制中,并不是因为RTO时间到达从而触发重传机制,该重传机制是根据对端的反馈信息进行重传,当连续3三收到相同的ACK报文时,发送端会重传数据。这3个连续的ACK报文被称为冗余ACK。
累积确认----选择确认
选择确认机制也是需要进行协商的。
流控------流量控制机制
<span style="background-color:#f8f8f8"><span style="color:#333333">滑动窗口:指定的是无需等待确认应答,而可以继续发送数据包的最大值</span></span>
窗口大小体现在缓存区的大小
TCP要求发送方依据接受窗口rwnd来控制数据的发送量。rwnd等于接收方接受缓存大小-已存数据量大小,rwnd是可变的
TCP面向链接
TCP连接的建立
<span style="background-color:#f8f8f8"><span style="color:#333333">TCP连接需要解决的的问题:
1.要使双方均知晓对方的套接字信息。
2.允许双方进行参数协商(MSS,窗口值,是否是哦那个选择确认机制)
3.给各设备进行资源分配</span></span>
不同时连接
刚开始,都是close状态,然后服务端进行准备工作,打开端口,给自己分配一个接受缓存,成listen监听状态
然后客户端发送请求建立连接,SYN同步位为1,成同步已发送状态SYN-sent状态,序列号为随机值
不能带数据,因为还不知道服务端的缓存
服务端回复报文,ACK确认包,成同步已接受状态,SYN-rcvd,收到了,确认序列号,确认序列号为+1(序列号+数据大小,消耗序列号),这个包也有序列号,随机值,也有同步位,,因为是全双工
建立发送缓存客户端也会接受ACK,成连接已建立状态,Esta
同时连接
通讯双方都是客户端,
C1发送SYN,C2也发送SYN,两者的套接字都相同,IP,端口相反,C1:seq=x,C2:seq=Y,他们的状态转化成同步已发送状态,C1先发送,C2就要回复ACK,成同步已接收状态,ack=x+1,seq=Y(C1没有回复第一个报文,就接着用这序列号),SYN=1,C1:ack=y+1,seq=x(请求包还没有收到,就是x),SYN=1,C1成同步已接收状态,C1接收到确认后就进入连接已建立状态
TCP连接释放
<span style="background-color:#f8f8f8"><span style="color:#333333">1.对双方各自资源的释放的过程
2.任何一放在数据传输后都可以发出连接释放请求</span></span>
不同时断开
客户端主动发服务端发送请求释放连接,单向的,FIN报文=1,成终止等待状态-1(等服务器的确认),seq(跟着上面的数据走),ack(前面),这个报文不携带数据,服务器收到数据后成关闭等待状态(我向你的还没有关闭),服务器发送确认报文,ACK=1,ack(跟上面序列号走,但要+1),seq(跟着确认序列号来),此时已经关闭客户端向服务端的状态,半关闭状态,持续时间很长,客户端收到回复报文后会成为终止等待状态-2(等服务器的终止连接请求),接下来该服务器断开连接,发出请求断开连接报文,然后服务器成最终确认状态,FIN=1,seq=w(跟着前面的确认报文v,可能会带着数据),ack=u+1(害怕我上面的报文丢了,丢了状态就切换不过来,客户端信息已经发完了,只会是u+1),客户端切换成时间等待状态,ACK=1,aeq=u+1,ack=w+1,服务器进入关闭状态,然后才会进入关闭,2.MSL,最大报文传输时间
同时断开
C1向C2发送FIN=1的报文,ACK=1,seq=u,ack=v(假定),C1的状态切换成终止等待-1,C2也发送请求断开连接(),seq=v,ack=u,也成了终止等待状态-1,为什么序列号是向相反的(他发这个报文是因为自己再发,因为这两个没关联的,各自想法的,在这之前,还有数据的传输),C1先发的,那就是C2先接收到,C2就要先回复,ACK=1,aeq=v+1(序列号的增加的,不发数据的时候只消耗一个序列号),ack=u+1(这是确认你的请求断开连接的报文,消耗一个),C2会进入同时关闭的状态,我已经发出了断开连接的报文,而且也收到了对方的断开连接报文,C1回复ack报文,进入同时关闭的状态,seq=u+1,ack=v+1,两个状态太一起切换成关闭状态