tcp/ip协议、三次握手等是什么样的

2020-08-01 17:41:03 浏览数 (1)

这个话题很是老生常谈了~~

毕竟这个问题算是很基本的了,平常处理网络问题的时候,这个基础点作为技术支持是必须要了解的,可能没有那么深,但是要知道发生了个啥,在和客户、网络专家沟通的时候要知道人家说的是什么

1、什么是tcp连接

tcp是面向连接的、可靠的、全双工的传输层协议,工作在osi网络模型中第四层的传输层,从服务器角度来说,是建立在客户端和服务端的进程之间的,保证两者之间的数据可靠传输。

1.1、 网络模型如图

1.2 、数据传输过程

应用层的程序发起数据请求,到达传输层,然后根据数据大小分割为多个数据段,传输层会给每个数据段封装一个tcp首部(一般是20字节);

封装好的数据包到达网络层后,添加ip包首部信息(一般是20字节),这里网络层支持的数据包最大可以到65535字节,但是数据链路层支持的最大传输单元(MTU)是1500字节,所以需要在网络层对数据包进行分片处理,按照最小单元值来传输;

在物理层会将数据转换为bit流在物理线路中传输到对端。

这里ip地址是为了寻址,即决定了目的地,而mac地址是决定了下一跳的节点,在整个传输过程中,目标mac地址是会根据交换机、路由等节点而更换的。

结合抓包来看,一般来说基本是如下的分层情况,可能不是太严格,因为实际上在wireshark上来看包信息的时候,会有各种各样的展示,所以需要分场景来分析。当然这里有些层次的显示是固定的,比如网络层、传输层等

1.3、mtu和mss

百度百科:https://baike.baidu.com/item/最大传输单元/9730690?fromtitle=mtu&fromid=508920&fr=aladdin

mtu:最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。

是包或帧的最大长度,一般以字节记。如果MTU过大,在碰到路由器时会被拒绝转发,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分操作系统会提供给用户一个默认值,该值一般对用户是比较合适的。

数据链路不同,最大传输单元( Maximum transmission Unit,MTU)也不同,由于IP协议是数据链路的上一层,所以它必须不受数据链路的MTU大小的影响能够加以利用。当IP数据报太大时,就要采用分片技术,以保证数据帧不大于要过的网络的MTU。

IP协议除了具有路由寻址功能外,另一个重要的功能就是IP数据报的分片处理。每个数据链路层能够确定发送的一个帧的最大长度称为最大传输单元。在Ethernet中,MTU为1500字节;在FDDI中,MTU为4352字节;在 IP over AMT中,MTU为9180字节。

mss:最大报文段长度(MSS)是TCP协议的一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(不包括文段头)

mtu和mss的区别:

最大报文段长度(MSS)与最大传输单元(Maximum Transmission Unit, MTU)均是协议用来定义最大长度的。不同的是,MTU应用于OSI模型的第二层数据链接层,并无具体针对的协议。MTU限制了数据链接层上可以传输的数据包的大小,也因此限制了上层(网络层)的数据包大小。例如,如果已知某局域网的MTU为1500字节,则在网络层的因特网协议(Internet Protocol, IP)里,最大的数据包大小为1500字节(包含IP协议头)。MSS针对的是OSI模型里第四层传输层的TCP协议。因为MSS应用的协议在数据链接层的上层,MSS会受到MTU的限制。

2、

2.1、三次握手

三次握手简单来理解就是SYN——》SYN,ACK——》ACK,看到这样的规则就是握手了,一般没什么问题

2.2、四次挥手

四次挥手是重点,我们常见的问题都是出现在断连的身上

为啥我们常说tcp是全双工的,从四次挥手上就可以体现出来,因为连接需要两个方向都必须要单独进行关闭,就是当客户端完成数据发送任务后,发送一个FIN来终止我客户端的连接。而收到一个FIN只是意味着单一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,只要服务端没发送fin,我服务端就可以持续发送数据给客户端,直到服务端也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

2.3关于连接中的状态介绍

常见的查看连接的状态命令,netstat(Windows、linux),ss(linux)

(客户端和服务端都可以主动发起连接)

LISTEN:监听来着其他TCP端口的连接请求

SYN-SENT:客户端发起第一次握手后,等待服务端返回 【SYN,ACK】的状态。(如果发现SYN_SENT非常多且在向不同的机器发出,那你的机器可能中了冲击波或震荡波之类的病毒了。这类病毒为了感染别的计算机,它就要扫描别的计算机,在扫描的过程中对每个要扫描的计算机都要发出了同步请求,这也是出现许多SYN_SENT的原因)

SYN-RECV:服务端发起第二次握手后,等待客户端返回【ACK】的状态。(如果服务器上有很多这种状态的连接,一般是被攻击了,TCP SYN Flood,它透过一定的操作破坏tcp三次握手建立正常连接,占用并耗费系统资源,使得提供TCP服务的主机无法正常工作)

ESTABLISHED:代表一个打开的连接

FIN-WAIT-1:第一次挥手后,客户端主动发起fin后的连接状态,这个状态消失的很快,一般很少见到

FIN-WAIT-2:第二次挥手后,客户端收到服务端的【ACK】后的状态。

CLOSE-WAIT:第二次挥手后,服务端发出【FIN,ACK】的状态,等待着连接关闭

LAST-ACK:第三次挥手后,服务端发送【FIN】后的状态,等待着最后一个ACK的返回

TIME-WAIT:第四次挥手后,客户端发送【ACK】后的状态。(最为常见的状态了,这种一般是主动发起关闭连接的一方出现的,当然不排除双方同时关闭连接,此时两端都可以出现,一般等待2*msl(1到4分钟)后就释放了。问题最多的也是这个状态中的连接,后面有机会在聊聊)

CLOSED:连接关闭的状态

2.4、连接建立过程中的SYN/ACK等含义

这里的所有标志位都是在tcp首部里规定的

序号:Seq (Sequence Number是发送数据包中的第一个字节的序列号,32位)

确认号:Ack (Acknowledgment Number是确认序列号,32位)

标志位:syn/rst/fin等

URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。

ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。

RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。

FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

0 人点赞