TCP是什么
TCP---是一种面向连接的可靠性传输协议
什么是面向连接---在传输之前,先使用预备的协议建立点到点的链接,之后进行数据传输
特点:
特点:
1,TCP是面向虚连接的传输层协议
2,每条TCP连接有且只有两个端点,即每一条TCP连接只能是点对点的
3,可靠,有序,无丢失,不重复
4,TCP提供全双工通讯。
1)发送缓存---应用程序发送方发送TCP准备发送的数据
TCP已发送但尚未被收到确认的数据
2)接收缓存---按序到达但尚未被应用程序处理的数据
乱序到达的数据
5,TCP是面向字节流的
tcp的四元组
TCP连接的四元组:源IP,源端口,目标IP,目标端口---两两为一组,每一组信息被称为套接字(一个IP+一个端口)
TCP报文
报文讲解:
TCP的头部是可变长头部---最短20个字节
序号字段:
每发送一个字节,序号加1,序号=上一个报文的数据大小+上一个确认报文的序号
确认序列号:
1,该确认序列号表示接收方期望收到发送方发送的下一个字节的序号。
2,代表接收方已收到该确认序列号之前的所有字节。
TCP确认机制被称为累积确认---即收到的所有数据可以用一个完整的数据报文回复。
保留字段:
6byte。
窗口值:
指发送方可以不需要接受确认报文,就可以连续发送的最大数据流
选项字段:
MSS,时间戳,选择确认机制,窗口因子
标记位:
确认位ACK:当ACK=1时,确认序列号字段有意义,在TCP连接建立后,所有传输的报文段都必须将ACK置为1。
同部位SYN:代表连接请求。
终止位FIN:表明此报文段发送方发送数据已全部发送完毕,代表要求释放连接
复位RST:表明TCP连接出现严重错误,必须释放连接并重新建立连接
紧急位URG:当该位等于1时,表明此报文中存在紧急处理的数据是高优先级,放在数据前面部分,必须尽快交付应用处理,与紧急指针配合使用。紧急指针代表要紧急处理的数据的长度。
推送位PSH:该位置为1,则将该数据包前面(包括该数据包)全部一次性交付给程序执行。
校验和
---确保数据的完整性---反码相加法---伪头部校验---12个字节的内容一起进行校验---32位源IP地址,32位目标IP地址,8位保留,16位的总长度,8位协议。
选项字段:
TCP中附加的功能,如果不满足4字节,则用“填充”字段填充0。
三次握手
三次握手:
TCP建立连接的前置条件或需要解决的问题
1,每一端知晓对端的套接字
2,进行参数协商(MSS,窗口值,是否使用选择确认机制,窗口扩大因子,时间戳)
3,设备对资源进行分配
客户端和服务端的定义:谁先发报文谁是客户端
三次握手:
c/s
客户端和服务端建立连接之前处于close关闭状态,服务端先分配一个接收缓存,然后进入下一状态---listen监听状态,客户端给服务端发送数据包,同时客户端进入SYN-sent同步已发送状态,报文中包含:数列号seq=x(随机数),SYN同部位=1。此数据包中不携带数据:因为客户端没有发送缓存(发送缓存是服务端给客户端发送的信息报文中的窗口字段大小设定)。服务端收到报文后进入下一状态---SYN-RCVD同步已接收状态。服务端回复ACK确认报文,其中包含:ACK标志位=1,ackeq=x+1(上一个接收报文的序列号+数据部分大小,当数据报文中不携带数据时,会消耗一个序列号),此时已经建立好了客户端到服务端的单向通道,两者之间的状态称为半连接状态。客户端收到服务端的回复之后,进入下一状态---Esta连接已建立状态,同时分配一个发送缓存。同时服务端给客户端发送包含SYN=1的数据包来建立服务端到客户端的连接,这个数据包与上面的回复确认报文合并为一个报文,表示这个报文既是确认报文也是回复报文。此报文中包含:回复ACK=1,ackeq=x+1,SYN=1,seq=Y(随机数),这个报文不携带数据。客户端收到该信息回复一个确认报文,此报文中包含:ACK=1,seq=x+1,ackeq=Y+1,这个报文可以携带数据,这个数据包发送之后不需要得到回应,如果此报文丢了,客户端不会触发重传机制,对服务端而言,没有收到第三个确认包文便会重传第二个请求连接报文,客户端会被动确认,因此再发送第三个报文。当服务端收到该确认包时进入Esta状态,此时双方的双向连接建立完成,服务端的下面报文可以正常传递数据。
c/c
客户端和客户端的通信:
首先两边都处于slose关闭状态,然后分别向对方发送(不是同时)一个数据包,里面包含:SYN=1,seq=x/y(随机生成),两边进入SYN-sent同步已发送状态,c2给c1发送一个确认数据报文,里面包含:ACK=1,确认序列号ackseq=x+1,SYN=1,seq=y(因为c2还没有收到确认报文,所以只能用原来的序列号y),状态进入SYN-RCVD同步已接收状态,c1接收到c2发送的第一个报文,回复ACK确认报文,里面包含ACK=1,ackseq=y+1,SYN=1, seq=x(原理同上),同时进入SYN-RCVD状态,两边都受到对端发来的确认报文后,都进入Esta连接已建立状态。
在三次握手中
第一个报文丢失:客户端重传
第二个报文丢失:客户端和服务端都要重传
第三个报文丢失:服务端重传
四次挥手
c/s
两边处于Esta连接建立状态,客户端向服务端发送一个请求断开连接的报文,其中包含:FIN=1,seq=x(根据数据传输的内容得到,不是随机产生),ACK=1,ackseq=v(确认收到上一个数据包,值为上一个收到的数据包的序列号+数据大小),进入FIN-wait-1终止等待1状态,并且回收自己的缓存。服务端收到报文后,回复确认报文,其中包含:ACK=1,ackseq=u+1(如果报文中不携带数据,则消耗一个序列号),seq=v,这个报文可以携带数据,客户端收到这个报文,进入FIN-wait-2终止等待2状态。此时两边进如半关闭状态。客户端给服务端发送请求断开链接数据报文,其中包含:FIN=1,seq=w(v+数据大小),ACK=1,ackseq=u+1(因为客户端没有数据要发所以还是u+1),客户端进入Last-ack最后确认状态,客户端收到此报文后进入Time-wait时间等待状态。客户端给服务端回复确认报文,其中包含:ACK=1,ackseq=w+1,seq=u+1,服务端收到此报文,进入close关闭状态。客户端等待2倍MSL时间(这个时间内没有收到新的数据包,表示服务端数据传输完毕)后,进入close关闭状态---MSL最长报文段寿命---2mins
时间戳:
客户端发送消息时,会携带一个时间(电脑内部存在的时间)T1,服务端接收到该数据包时,会回复数据包,该包中携带自己的时间T2,并且会把服务器的时间T1也一并携带发送给对方,客户端收到该数据包时,时间已经到达T3,根据T3时间减去T1时间得出回包的时间,如果这个差值过离谱,则认为该数据包是历史报文。发送一个数据包到接受一个数据包的时间就是RTT,从而得到RTO。
保活计时器
TCP还设有一个保活计时器,Client端如果出现故障,Server端不能一直等下去,这样会浪费系统资源。每收到一次Client客户端的数据帧后,Server端都的保活计时器会复位。计时器的超时时间通常是设置为2小时,若2小时还没有收到Client端的任何数据帧,Server端就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,Server端就认为Client端出了故障,接着就关闭连接。如果觉得保活计时器的两个多小时的间隔太长,可以自行调整TCP连接的保活参数。
TCP传输可靠性---确认,重传,排序,流控。
确认机制:
传输确认,每收到一个数据段,均需要进行一次确认
重传机制:
超时重传:当一个数据段中的某个报文丢失,会提醒要求重新传输该丢失报文。
RTT往返时间:发送方将数据发出后到它接收到对端反馈的确认报文的完整时间段
RTO超时重传时间:略大于往返时间,且RTO时间的动态变化的,RTO时间会进行超时间隔时间加倍。
快速重传:客户端通过服务端的反馈信息从而进行数据重传的方式被称为快速重传机制,此时的重传并不是因为RTO时间到达而触发,而是因为客户端连续收到3个冗余ACK报文---快速重传机制会在RTO定时器超时之前重传报文段,从而解决超时重传加倍导致延迟增大问题。
为了加快重传效率,将累积确认机制修改为选择确认机制(SACK),在TCP首部中的选项内容中携带未收到的数据字段,从而引发客户端重传。在最开始需要协商选择哪种确认机制。
排序机制:
传输一个数据段,被分为多个报文,从不同路径传输,最终到达目的地的顺序会被打乱,需要重新排列组合恢复原始报文内容。
流控机制(滑动窗口机制):
调节窗口大小来对流量进行控制
窗口大小:指无需等待确认就可以连续发送的最大数据量。
接收方会在连接建立之前创建一个接收缓存,用以存放发送方发送的数据,窗口大小在最初等于缓存大小,之后,窗口大小=缓存大小-已存在缓存中的数据量---接收窗口大小(rwnd)
发送方根据每一次收到的确认报文中的窗口字段,及时调整发送缓存的大小,确保发送缓存小于等于窗口值。
MTU和MSS
MTU
---最大传输单元---包含数据部分,传输层头部,网络层头部---以太网环境下-最大1500字节,最小46字节
MSS
---传输层数据部分---最大段长度---仅包含数据部分---MTU-IP头部-TCP头部---一般合理值为1460字节---这个值会在TCP三次握手的前两次SYN包中进行协商,如果两边MSS值不同,以小的为准。