TCP头部信息:每个TCP报文段,用于指定通信的源端端口号,目的端端口号,管理TCP连接,控制两个方向的数据流
TCP状态转移图
TCP数据流
TCP数据流的控制
特点:面向连接,可靠传输,数据流。
TCP协议的使用要求:双方必须先建立连接,再开始数据的读写。
双方必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。-》全双工,双方的数据读写可以通过一个连接进行,完成数据交换后,通信双方都必须断开连接以释放资源。连接为一对一,所以基于广播和多播的应用程序不能使用TCP服务。
数据流:发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系。应用程序对数据的发送和接收没有边界限制。数据报:发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报发送,接收端必须及时针对每一个UDP数据报执行读操作,否则就会丢包,并且,没有指定足够的应用程序缓冲区来读取UDP数据,UDP数据将会被截断。
**可靠:**TCP采用发送应答机制,发送端发送的每个TCP报文段都必须得到接收方的应答,才认为这个TCP报文段传输成功。
TCP采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时事件内未收到应答,将重发报文段。
TCP的头部结构:
16位端口号:告知主机该报文段来自哪里以及传到哪个上层协议或者应用程序。(TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器使用知名端口号。)
32位序号:一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号。
32位确认号:用作对另一方发送来的TCP报文段的响应。
4位头部长度:标识该TCP头部有多少个32bit字,因为4位最大能表示15,所以TCP头部最长0=60个字节。
6位标志位:URG:紧急指针
ACK:确认号
PSH:提示接收端应用程序立即从TCP接收缓冲区中读走数据 RST:对方重新建立连接
SYN:请求建立一个连接
FIN:关闭连接16位窗口大小:TCP流量控制的一个手段。
16位校验和:接收端对TCP报文段执行CRC算法以校验TCP报文段在传输过程中是否损坏。16位紧急指针:一个正的偏移量。seq:序号值TCP:状态控制码(Code,Control Flag)标志位字段(U、A、P、R、S、F):占6比特。各 比特的含义如下:URG:紧急比特(urgent),当URG=1时,表明紧急指针字段有效,代表该封包为紧急封包。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据), 且上图中的 Urgent Pointer 字段也会被启用。ACK:确认比特(Acknowledge)。只有当ACK=1时确认号字段才有效,代表这个封包为确认封包。当ACK=0时,确认号无效。PSH:(Push function)若为1时,代表要求对方立即传送缓冲区内的其他对应封包,而无需等缓冲满了才送。RST:复位比特(Reset) ,当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。SYN:同步比特(Synchronous),SYN置为1,就表示这是一个连接请求或连接接受报文,通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。。
FIN:终止比特(Final),用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
**一个正常的TCP连接,都会有三个阶段:**1、TCP三次握手 ; 2、数据传送; 3、TCP四次挥手和TCP建立连接相关的首部报文信息:SYN、ACK半关闭状态:允许两个方向的数据传输被独立关闭,即通信的一端可以发送结束报文段给对方,告诉本端已经完成了数据的发送,但允许继续接收来自对方的数据,直到对方也发哦是那个结束报文段以关闭连接。
连接超时TCP状态转移图:
TIME_WAIT:简单来说就是两个作用,
可靠的关闭TCP连接,保证让迟到的报文段被丢弃不被使用。TIME_WAIT是主动断开连接方在接收到对端确认结束报文时的一种状态。它的存在是为了防止对端没有收到主动断开方最后的确认信息的这种情况,这是如果没有收到,对端会再重送一个数据报,此时的TIME_WAIT就是为了接收这个数据报。如果TIME_WAIT时间内(2MSL内,MSL是报文段最大存活时间一般是2min)没有再收到就说明最后的确认报文对端已经收到。
另一个作用是当一个连接处于TIME_WAIT状态时,也就表明这个连接的端口被占用,不能再在这个端口建立新的连接,如果没有这个状态,那么程序有可能再在这个端口上建立另一个连接,这就有可能收到原来的数据。TIME_WAIT什么时候会出现?以及发现过多TIME_WAIT状态时怎么办;当主动断开连接方接收到对端的结束报文之后,连接就会处于TIME_WAIT状态服务器过多TIME_WAIT状态有可能是遭到了SYN攻击,或者编码时没有注意规范,在服务端主动断开了连接。解决办法修改内核参数让TIME_WAIT状态的SOCKET可重用,修改TIME_WAIT时间,快速回收TIME_WAIT状态的SOCKET。
发起TCP连接时IP不存在,哪一层反馈错误信息;分三种情况,一种是DNS中找不到你给的域名的IP,此时应用层就会反馈,
另一种是在局域网中你直接给的对端IP,ARP表里面找不到IP,此时数据链路层就会反馈,
最后一种是在广域网中,你给的IP在网络中无效,路由器就没有办法实施路由,网络层就会反馈。在应用场景上UDP更多的用于对数据的安全性要求不高的应用,或者用于对网络传输速率要求和对时延要求比较高的应用。而TCP则更适用于对数据的安全性要求比较高的应用。像QQ这类的即时通讯应用就使用的UDP,因为它们对网络时延的要求比较高,但是为了数据的安全性,可能对UDP进行了封装(在应用层加入了UDP应答包),这也就是UDP优势于TCP的地方,它提供了更为自由的数据传输方式,如果你需要对你的数据传输方式加以优化则可以自己对UDP在应用层进行封装。
TCP的定时器重传定时器:为了保证数据报文的成功到达,每当发送数据报的时候这个定时器就会开始计时,超过时限就会要求重新发送数据报。坚持定时器:当TCP客户端接收到服务端的一个零窗口报文时,就会启动这个定时器,定时器到期就会发送一个探测报文查看是否窗口有位置空出来了。有空则客户端继续发送数据,没有则重置定时器继续计时。重复上述动作。保活定时器:当TCP连接双方出现长时间的没有数据传输的状况,服务器每收到一个数据报就会重置一个定时器,然后开始计时,如果计时完还没收到下一个数据报就终止这个链接。时间等待定时器:也即是TIME_WAIT状态下的定时器。
TCP的超时重传:
因为网络传输中经常会出现丢包事件,TCP模块需要为每个TCP报文段维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动,如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。默认重传次数是5,每次重传超时时间都是前一次的一倍,第一次是0.2s。
流量控制:(滑动窗口SWND)
通信双方不会考虑网络的拥塞状况直接发送数据,一旦某个时刻同时发送数据,造成网络阻塞,就可能会造成网络阻塞丢包,通过滑动窗口机制来控制发送数据包的速率。滑动窗口过小会出现传输效率低的问题,造成频繁的发送和接受确认报文。滑动窗口过大和没用窗口没什么区别,会造成拥塞。
拥塞控制:
主要分为四个部分,慢启动,拥塞避免,快重传,快恢复
慢启动和拥塞避免:
这里我们首先要知道一个概念就是,TCP报文在传输过程中,一次能够传输多少报文是由一个SWND(发送窗口)来控制的,要合理的选择SWND大小,太大就会造成拥塞,太小会造成延迟。所以就又出现了RWND(接收窗口)和CWND(拥塞窗口),SWND通常是他两之间的较小的那个。为了进一步提高网络带宽的利用率此时就出现了慢启动的算法,因为TCP模块在刚开始接收数据时并不知道网络的实际情况,就要使用一种相对平滑的方式扩大CWND,让CWND慢慢的变大,但是实际上慢启动的实现是让CWND成指数的扩大,如果不加以限制很快就会造成网络拥塞。
这个时候就出现了拥塞避免,其思想就是减慢CWND的扩大速度,让他线性的扩大。
(具体算法就是:CWND += SMSS*SMSS/CWND(了解内容,SMSS就是TCP报文段的最大长度))
快重传和快恢复:
当发生拥塞之后肯定会出现发送端连续接收到多个确认报文段的情况,这个时候说明数据报已经乱序,必然已经发生拥塞,TCP规定如果连续收到3个确认报文段就立即发送对方尚未收到的数据报,而不必等待重传计时器的时间到期。这就是所说的快重传。
但是重传的话又会重新开始一遍慢开始算法,这样就很浪费时间,他这里就直接使用原来的CWND的二分之一,然后再接着进行拥塞避免算法。这就是快恢复。
TCP断包和粘包现象?
粘包,拆包是针对tcp协议的。
粘包、拆包发生原因
1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
粘包、拆包解决办法
1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
2、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。
请给出从浏览器地址栏输入网址到网页完全展示经过了那些网络协议;
这个问题按照协议栈模型来讲,如果是一个http请求,肯定要经过http协议,应用层会对域名进行解析,肯定就有DNS协议,到了传输层就会用到TCP协议,接着是网络层的IP协议。接着服务器返回回来时会使用到ARP协议找到你的主机。