协议概述
TCP是一种传输控制协议 是一种面向连接的、可靠的、基于字节流的传输层通信协议
UDP是一种用户数据报协议 是一种无连接、不可靠(可靠性可由应用层负责校验)
组播和广播不能基于TCP
比如说BGP(边界网关协议)携带的路由信息较多,需要跨不同网络发送,且需要保证可靠性,故基于TCP;
OSPF不基于UDP也不基于TCP。TA基于IP协议!
RIP因为需要周期性全网组播路由信息,路由信息数目巨大,故使用UDP协议保证效率。
报文头部
- TCP头部
- UDP头部
- TCP和UDP的区别
- 连接
- TCP面向连接,传输数据前需要先建立连接
- UDP不需要连接,直接传输数据
- 服务对象
- TCP是一对一,一条连接两个端点
- UDP支持一对一、一对多、多对多的交互通信
- 可靠性
- TCP可靠交付数据
- UDP尽力而为,不保证可靠性
- 拥塞控制、流量控制
- TCP有拥塞控制和流量控制机制,保证传输安全性
- UDP没有,即时网络拥塞了,也不会影响UDP的发送速率
- 头部开销
- TCP头部没有使用(选项)字段长度为20字节,使用(选项)长度更长
- UDP头部8字节,并且是固定不变的,开销小
- 连接
- 为什么关闭连接要设计成四次?
相较于TCP三次握手,TCP挥手时需要释放两端的资源(内存、端口等),因此多了个对端的FIN状态
- 服务端运行一段时间后,套接字出现了大量的Close_Wait状态,最有可能是什么原因导致的?
对端收到FIN
- 为什么基于TCP的程序往往都有个应用层的心跳检测机制?
TCP建立连接后,只是在两端的内核里维持TCP信息,实际上并没有一个物理的链接通路,对端这时候挂了,谁也不知道 ["你是否还活着?挂了的话我就把你踢掉释放资源了"]
- 服务端的Time_Wait状态再哪个阶段出现?持续多久?为什么要设计这么一个状态?
- 本端已经发送最后一个ACK后出现,等待一段时间关闭,一般持续时间为2MSL。因为这时候不确定ACK对端是否能收到,保持连接的话对端没收到ACK还会重发
- 如果这时候对端还有半路上没到本端的信息化,本端关闭时如果有同样端口的服务起来,那就错乱了(实际上是不可能的,因为ACK是按照时间累加的,这里做保险)
- 如何唯一确定一个TCP连接?
- 源地址
- 源端口
- 目的地址
- 目的端口
通过地址确定对方主机 后 通过端口确定进程
- 为什么需要TCP协议?TCP工作在哪一层?
因为TCP是一个工作在传输层的可靠传输的服务,他能确保无损坏、无间隔、非冗余和按序的
- 什么用TCP?
TCP是面向连接的、可靠的、基于字节流的传输层通信协议
- 面向连接:一定是[一对一]才能连接,不像UDP协议 可以一个主机同时向多个主机发送消息
- 可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文能到达接收端
- 字节流:消息是[没有边界]的,所以无论我们消息有多大都可以传输,并是有序的,当前一个消息没有收到的时候,及时后面的字节已经收到那么也不能扔给应用层处理,同时对重复的报文进行丢弃
- 为什么TIME-WAIT等待时间是2MSL?
MSL≥TTL(确保报文自然消亡)、一来一回需要等待2倍时间。2MSL的时间是从客户端接收到FIN后发送ACK开始倒计时的。如果TIME-WAIT时间内,因为客户端的ACK没有到达服务端,客户端又接收到了服务端重发的FIN报文,那么2MSL重新倒计时。linux中2MSL默认60秒。
- 为什么需要TIME_WAIT状态?
- 防止旧连接的数据包
- 保证连接正确关闭
- TIME_WAIT过多有什么危害?
- 内存资源占用过多
- 端口资源占用过多,一个TCP连接至少消耗一个本地端口[32768--61000为可开启端口]
__________________2020/10/11日更新___________________________
华为防火墙的TCP UDP和ICMP协议创建会话情况
协议 | 开启状态检测 | 关闭状态检测 | |
TCP | SYN报文 | 创建会话,转发报文 | 创建会话,转发报文 |
TCP | SYN+ACK ACK报文 | 不创建会话,丢弃报文 | 创建会话,转发报文 |
UDP | 创建会话,转发报文 | 创建会话,转发报文 | |
ICMP | Ping回显请求报文 | 创建会话,转发报文 | 创建会话,转发报文 |
ICMP | Ping回显应答报文 | 不创建会话,丢弃报文 | 创建会话,转发报文 |
ICMP | 其他ICMP报文 | 不创建会话,转发报文 | 不创建会话,转发报文 |
华为防火墙查看会话表 display firewall session table verbose
特点讲的很清楚哟