一 tcp连接回顾
bash
记录的目的: 亲身参与进来,'加深'记忆
① 引入
bash
前面我们'知道': TCP 是'面向连接 [点对点的单播]'的、可靠的、基于字节流的'传输层'通信协议
面向连接'意味'着:在使用'TCP'之前,通信双方必须先建立一条'虚拟'连接'通道channel'
② 什么是tcp连接
TCP和UDP可以使用同一端口 TCP和UDP可以使用同一端口吗
bash
说明: 一个是通过'动态'变量形式,一个是通过'修改'源代码形式来扩展'nginx'反向代理的tcp连接
通过proxy_bind指令解决使用nginx作为反向代理端口耗尽问题
Linux 中每个 TCP 连接最少占用多少内存? 命令行查看
bash
思考: 多个 TCP 服务进程可以绑定'同一个端口'吗?
答案:
1、如果两个 TCP 服务进程'绑定的 IP 地址不同',而'端口相同'的话,也是可以绑定'成功'的
2、如果两个 TCP 服务进程同时绑定的 IP 地址和端口'都相同',那么执行'bind()'时候就会出错
错误是: 'Address already in use'
④ Linux中查看TCP状态
bash
粗略查看'进程'的'tcp'连接数和状态: netstat -napt | grep nginx
bash
需求: 统计'TCP'的状态
netstat -n | awk '/^tcp/ {++S[$NF]} END{for(a in S) print a, S[a]}'
说明: 后续深刻理解下面'八种'状态
解决webserver tcp连接大量CLOSE_WAIT 问题
⑤ TCP payload载荷长度
二 TCP三次握手
bash
TCP'正常'建立连接是通过'三次握手'来进行的,本文暂时'不考虑'异常场景
重点:
1、每次握手的'目的'
2、握手的过程'TCP'控制位变化
3、tcp连接过程中状态时序图的转换
4、理解TCP的'确认'机制
目标: 当前阶段对'三次握手'有一个'基本'的认识即可
① 三次握手的图谱
bash
说明: 下面将'SYN'初始化为'1',便于'理解'
bash
说明: 三次握手过程'简要概述'
② 第一次握手
bash
server: CLOSE --> 'LISTEN'
client: CLOSE --> 'SYN-SENT'
补充: SYN报文'不包含应用层'信息
注意: SYN报文中32位'序列号'的内容来源
备注: SYN是TCP'建立连接'的时使用的'握手'信号
SYN: synchronous
③ 第二次握手
bash
server: LISTEN --> 'SYN-RCVD'
补充: SYN+ACK报文'不包含应用层'信息
④ 第三次握手
bash
说明: ACK 报文可以携带'应用'数据
ACK: ACKnowlegment '确认'
⑤ 三次握手中每一次握手的目的