计算机网络面试——TCP协议

x33g5p2x  于2022-03-18 转载在 其他  
字(2.9k)|赞(0)|评价(0)|浏览(467)

一、写在前面
TCP协议是传输层的协议,为应用层协议协议提供了安全保障工作,下面我们将详细了解一下TCP协议
二、TCP协议详解
1、TCP协议:TCP协议又称传输控制协议。
2、TCP报文的组成

3、TCP协议的特点:
3.1、TCP是面向连接的协议
TCP协议需要先进行三次握手,进行通信连接,由此可以知道TCP协议是安全的。
3.2、TCP协议是端到端的协议
这里的端到端的协议是指,我们可以把它理解为不同主机的进程之间的通信。
3.3、TCP协议提供可靠的传输服务
这里是由于TCP的三次握手,保证通信双方都存在,此时才进行数据通信,所以TCP协议提供可靠的传输服务。
3.4、TCP协议是面向字节流的协议。
3.5、TCP协议是全双工的协议
这里的全双工协议是指发送和接收可以同时进行的。
TCP报文的结构

1、16位源端口号和目的端口号
解释:这里存放发送方和接收方的端口号。
2、序号
解释:占用32位,表示该TCP报文从那个字节开始发送的。
3、确认号
解释:这里占用32位,如果确认号为N,则表示你发送的前N我已经收到了,接下来从N+1号开始发送即可。
4、数据偏移
解释:占用4位(最大表示数字为15),一位表示4个字节,此时表示TCP协议首部最大为 60个字节。
5、TCP标记
解释:占6位
URG:紧急位, URG = 1,表示紧急数据
ACK:确认位,ACK = 1,确认号
PSH:推送位:PSH = 1,尽快将数据交付给应用层
RST:重置位: RST = 1,表示重新建立连接。
SYN:同步位:SYN =1 ,表示连接请求报文。
FIN:终止位,FIN =1 ,表示释放连接。
6、窗口
解释:占16位,指明允许对方发送的数据量
7、校验和
解释:用来验证TCP报文是否出错
8、紧急指针
用来指明紧急数据在报文的位置
9、TCP选项
最多支持40个字节,支持未来拓展。

可靠传输的基本原理

1、停止等待协议:当发送方发送一个消息1,经过一段时间的等待接收到确认消息1,,
可能在发送的过程中出错或者出现阻塞的情况导致延迟,此时我们就需要设置一个定时器来解决这个问题,这个定时器
我们称为超时定时器,当超时的时候会进行重传。
2、连续ARQ协议
下图为连续ARQ协议,TCP协议的可靠传输基于连续ARQ协议,TCP的滑动窗口以字节为单位。

在TCP中如果存在例如25和27没有传送过去的字节,则需要重新传送,TCP选择重传,将重传字段放在TCP选项中。

TCP协议的流量控制

如上图所示为TCP流量控制流程图。
1、发送起始位置为1并且数据量为100的数据。
2、发送起始地址为101,并且数据量为100的数据。
3、确认信号,确认前两百位已经收到,接下来将从201开始发送,并且rwnd表示重新设置窗口大小为100
4、起始地址为201,发送数据量为100的数据。
5、返回确认信息,确认号为301,并且将窗口大小设置为0。
6、当设置窗口大小为0时,此时将会开启坚持定时器,确认是否窗口大小发生改变。
7、设置窗口大小rwnd为1000。

TCP协议的拥塞控制

1、拥塞控制和流量控制的区别
拥塞控制指的是全局,流量控制指的是端到端。
2、两种算法(慢启动 + 拥塞避免算法)
慢启动算法指的是:首先会生成一个报文,从小到大增加报文的数量(呈指数增长)。
拥塞控制算法:当到达慢启动算法的阈值时,就会启动拥塞控制算法,就是每一个报文确认,就加一,线性增长。
TCP协议就是尽可能的将数据发送到信道中。

TCP协议的三次握手

简单介绍一下TCP三次握手的过程。
1、首先发送方先发送一个报文其中包含内容(SYN = 1,seq = 1)表示请求连接报文,seq =x表示这次发送的序列号为1。
2、接受方接收到报文后,并向发送方发送一个(SYN=1, seq =y, ACK =1, ack = x +1)该报文表示这也是一个请求连接
的报文,并且发送自己的起始数据号y,并且也是一个确认报文,确认号为x+1。
3、发送方接受到报文后,再次发送一个报文,该报文为(ACK =1, ack = y+1, seq = x+1),表示该报文为确认报文
确认号为y+1,并加上自己的序列号x+1。此时发送方就转变为连接状态。
4、接收方接受到报文后,也转化状态为连接状态。

为什么TCP客户端最后还要发送一次确认呢?

最后一次发送一次确认最主要的目的就是防止失效的请求报文而产生错误,我们可以想一个这样的例子,当我们的客户端发送
一个请求报文,此时由于网络滞缓导致数据传输过慢。而客户端此时仍然没有拿到服务器发送过来的连接请求,此时就会再
一次发送请求报文,如果只存在两次的话,此时就该结束了,进行发送数据,然后关闭连接。当网络状态变好后,此时原本
失效的请求报文仍保存在网络中,并且到达服务器,此时服务器收到连接后,给出一个响应,此时如果是两次确认,则服务器
就会处于连接的状态,此时就会造成不必要的资源浪费。所以会出现三次握手,当第三次握手开启后,客户端就会发现这个
报文失效,此时就不会建立客户端和服务器之间的连接。

TCP的四次挥手

//简单阐述TCP的四次挥手的过程。
1、首先发送方先发送一个请求结束的报文(FIN =1, seq=x),FIN=1表示结束报文,seq表示发送方的序列号。
2、接收方接收到报文后,并且立即返回一个确认报文(ACK =1, seq=u, ack = x+1),ACK表示该报文是一个
确认报文,seq=u表示序列号为u,ack = x+1表示序列号。
3、接下来的时间,接收方如果还存在一些数据没有发送,则会继续进行发送。此时并不处于断开的状态,服务器也可以
处理一些请求。
4、过一段时间服务端会发送一个报文(FIN=1, seq=w, ACK = 1, ack = u +1 )的报文。
5、发送方接收到报文后并立即发送一个确认报文(ACK =1, ack = w +1, seq = w +1),并且开启等待计时器。
6、等待计时器等待的时间为2MSL(最长报文段寿命)
7、当时间过了,则发送方立即变成关闭状态。

等待计时器为什么要设置时间为2MSL

1、当发送方发送数据报,但是接收方没有接收到。接收方没有接收到数据包,则接收方会再次发送第三次回收的报文,这两次相当于两次报文传输时长,如果在2MSL时间发送方有接收到报文,说明第四次挥手的报文没有到达接收方,此时发送方会接着发送。
2、2MSL的时长,会使连接的所有报文都失效。

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

三次握手原因:因为在发送请求时,服务器已经处于LISTEN状态,在服务器发送确认报文时,服务器会将ACK和SYN在一个报文中进行发送。
四次挥手的原因:因为在断开请求时,客户端发送FIN时,此时服务器可能还存在人武部没有处理完,此时就会先回复ACK进行确认,
然后再进行FIN断开连接,此时我们可以知道ACK和FIN是分开的,所以需要三次握手和四次挥手。

如果连接成功,但是客户端出现故障该怎么办?

如果连接成功,此时客户端出现故障,此时服务器不能一直等待下去。TCP存在一个保活计时器,服务器没收到客户端的请求时,此时
就是重置保活计数器,如果两个小时没有收到客户端的请求,此时就会发送一个探测报文,每75s发送一次。如果发送10个没有任何
反映,此时说明客户端故障,此时服务器就会断开连接。

相关文章