TCP/IP
狐七 3/12/2022 计算机网络
# 1. TCP的三次握手和四次挥手
查看答案
TCP三次握手的目的是为了建立稳定而高效的链接。 TCP三次握手的过程:
- 客户端->服务器:要发送请求建立链接
- 服务端->客户端:可以发送请求
- 客户端->服务端:收到消息,链接建立
TCP四次挥手的目的是为了关闭链接。 TCP四次挥手的过程:
- 客户端->服务端:请求已经全部发送完毕,可以关闭链接了
- 服务端->客户端:好的我收到了,我这边还有一些要返回的数据
- 服务端->客户端:所有数据返回完毕,可以关闭链接了
- 客户端->服务端:好的,链接关闭
# 2. TCP为什么是三次握手不是两次或四次?
查看答案
因为TCP建立的是稳定而高效的链接,如果是两次握手,那么只是单向的建立了稳定的通道(服务端到客户端),而无法确定客户端是否可以接收到服务端的消息。如果使用四次,是没有必要的,三次已经可以确定双向通道了,第四次会造成网络带宽的浪费。
# 3. TCP为什么握手是三次,挥手却是四次?
查看答案
在建立链接的时候,服务器在接收客户端给的消息的时候,可以直接发送报文。 而在断开链接的时候,服务器收到断开链接的消息时,不会立即关闭链接,因为准备数据的时间会比较长,所以会先回复一个消息说收到了,等到服务器的内容都发送完毕了,才能发送断开链接的消息,所以不能一起发送,需要四次。
# 4. TCP和UDP的区别是什么?
查看答案
# TCP:
- 可靠传输:用于在传输层有必要实现的可靠传输其面向链接,且有顺序控制和重发控制等机制,可以提供可靠传输。
- 只支持单播传输,点对点(两个端点),不支持多播和广播。
- 基于字节流。
# UDP:
- 不可靠:不具有可靠性的数据报协议,虽然可以确保发送消息的大小,但是不能保证下次一定会到达。
- 用于高度传输和实时性有较高要求的通信或广播通信,支持多播和广播。
- 基于报文流。
- 用于视频会议,直播,语言视频通话。
# 5. TCP数据包的格式是什么?可选参数有哪些选项?
查看答案
# IP
- 版本4位:4(二进制0100)表示IPv4,6(二进制0110)表示IPv6
- 报头长度(单位4byte):因为选项长度不确定,取值范围是5-15(20-60byte)
- 服务类型:优先级(前3位)+ToS(后5位),首先按数据紧急情况划分出优先级,然后是ToS允许按照什么方式选择传输服务,ToS第1位表示最小时延即响应时间,第2位是吞吐量,第3位是最高可靠性,第4位是最低费用,第5位保留,不需要这些服务就填0
- 总长度(单位1byte):IP报头+数据长度(除本层协议外的都视为数据),所以载荷是总长度-报头长度
- 分段标识类型:表示同一时刻最多65536个包被分段(分片)来表示包编号,这个标识用于组装时确定某个分片是属于哪个包的
- 标志:分片标志是确定该包是否被分片,如果分片了是不是最后一片,第1位保留,第2位DF=0表示分片,DF=1表示未分片,第3位MF=0表示是最后一片,MF=1表示还有分片,MF结合组装buf中的偏移量是否完整来判断该包是否接收组装完成
- 分段偏移量(单位byte):分片相对报头偏移量,用于确定组装顺序,如果分片超时丢失将回复异常并重新分片收发
- TTL:包生存时间,防止数据包在网络中传输不休,以前是时间值,后来常用的是跳数递减,每经过一个路由值-1,减到0会返回相应错误,所以发起包的主机可以通过从1开始递增直到不返回错误时来测试要到达的目主机需要经过多少个路由器
- 报头16位校验和:计算报头长度指定数据,不包括载荷但要包含选项,无选项时为20个字节,发送计算时校验和本身要清0,然后算出校验和填充校验结果,接收方会将这20个字节用同样的方法计算出结果为0表示正确否则出错,而由于每个路由器都会对TTL-1,所以每经过一个路由都会对这个校验和重新计算填充,到达下一个路由又会再次校验,计算方法参考网址 (opens new window)
- 选项:是可选项,一般情况没有,如果有一般是时间戳、源点或路由加入的信息,用于选择松散路由(可选多条路)或严格路由(规定了路由路径)或记录路由,如果不够32位的整数倍就填0补齐
# TCP
- 源端口目的端口:是0-65535任何数字,在收到请求时系统会为客户端动态分配,0-1023为知名端口号
- 报文序号:用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的数据编号,用sequence表示
- 确认序号:只有ACK标志为1时,确认号字段才有效,它包含目标端所期望收到源端的下一个数据编号,用acknowledge表示
- 报头长度(单位4byte):因为选项长度不确定,取值范围是5-15(20-60byte)
- URG:紧急标志位,紧急指针有效,1表示有效
- ACK:确认序号有效,1表示有效
- PSH:推送标志位,1表示接收方应该尽快将这个报文段交给应用层,但只是整个数据的一部分并不是所有,类似收到短信提醒一样
- RST:1表示重新连接
- SYN:1表示发起一个新的连接
- FIN:1表示释放一个连接,finish
- 窗口尺寸(单位byte):此字段用来进行流量控制,这个值是本机期望下一次接收的最大长度
- 带伪头部的TCP报头校验和:这个是伪头部(12+20+选项长度+数据长度)16位校验值
- 紧急指针:它是一个偏移量(也就是先发的包长度),和报文序号字段中的值相加表示紧急数据最后一个字节的序号
- 选项:可能包括"窗口扩大因子"、"时间戳"等选项
- CRC: 从MAC到数据所有内容进行的CRC32校验结果,不论是传输层、网络层计算包长度时都不包含crc32这4个字节的长度,这是物理链路封包校验用的
- 大小端转换与协议字段:大小端的转换其实就是针对字段内的存储顺序转换,不能改变协议字段的先后顺序,这个先后就是从MAC层开始,MAC要放在协议开头前面,随着地址逐渐增大直到数据段以及CRC放在后面,将来收发双方才能按照这个顺序解析正确,所以针对不到一个字节的协议字段和大于1个字节的协议字段在结构体赋值和数组赋值时都不尽相同
# 6. TCP拥塞控制
查看答案
- 慢启动:窗口从1,2,4,8,16指数增长缓慢增大
- 拥塞避免:窗口从16到24缓慢增大
- 快速恢复 :如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK,窗口会缩减到12,采取拥塞策略
- 快速重传:如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK,发送端便知晓哪个报文段在传输过程中丢失了,于是重发该报文段
# 7. A、B 机器正常连接后,B 机器突然重启,问 A 此时 处于 TCP 什么状态?
问题
如果 A 与 B 建立了正常连接后,从未相互发过数据,这个时候 B 突然机器重 启,问 A 此时处于 TCP 什么状态?如何消除服务器程序中的这个状态?
查看答案
- 因为 B 会在重启之后进入 tcp 状态机的 listen 状态
- 只要当 a 重新发送一个数据包(无论是 syn 包或者是应用数据),b 端应该会主动发送一个带 rst 位的重置包来进行连接重置
- 所以 a 应该在 syn_sent 状态