TCP 连接建立的三次握手1、先提出一个问题 , 可以不进行三次握手直接往服务端发送数据包吗?
是不可以的 , 也是可以的;
1)不可以是因为现在的TCP连接标准和规范要求传输数据前先确认两端的状态 , 有一端状态不OK的话 , 发数据包有什么用呢;
2)说可以是站在网络连接的角度 , 像 UDP 协议;
TCP , Transmission Control Protocol , 传输控制协议 , 面向连接;UDP , User Data Protocol , 用户数据报协议 , 面向数据包;
2、TCP三次握手
文章插图
【TCP 连接详解】1)标志位、随机序列号和确认序列号是在数据包的 TCP 首部里面;
2)几个状态是指客户端和服务端连接过程中 socket 状态;
3)第一次握手 , 客户端向服务端发送数据包 , 该数据包中 SYN 标志位为 1 , 还有随机生成的序列号c_seq , 客户端状态改为 SYN-SENT;
4)第二次握手 , 服务端接收到客户端发过来的数据包中 SYN 标志位为 1 , 就知道客户端想和自己建立连接 , 服务端会根据自身的情况决定是拒绝连接 , 或确定连接 , 还是丢弃该数据包;
拒绝连接 , 会往客户端发一个数据包 , 该数据包中 RST 标志位为 1 , 客户端会报 Connection refused;
丢弃客户端的数据包 , 超过一定时间后客户端会报 Connection timeout;
确定连接时会往客户端发一个数据包 , 该数据包中 ACK 标志位为 1 , 确认序列号 ack=c_seq+1 , SYN 标志位为 1 , 随机序列号 s_seq , 状态由 LISTEN 改为 SYN-RCVD;
5)第三次握手 , 客户端接收到数据包会做校验 , 校验ACK标志位和确认序列号 ack=c_seq+1 , 如果确定是服务端的确认数据包 , 改自己的状态为 ESTABLISHED , 并给服务端发确认数据包;
6)服务端接到客户端数据包 , 会校验ACK标志位和确认序列号 ack=s_seq+1 , 改自己的状态为 ESTABLISHED , 之后就可以进行数据传输了;
7)建立连接时的数据包是没有实际内容的 , 没有应用层的数据;
8)建立连接之后发起的请求数据包 , 每个数据包都会封装各层协议的头部信息 , 标志位ACK为1 , 其他标志位变动;
9)网络进程间的通信 , 一台服务器内部的进程间通信不用这样;
3、TCP 连接三次握手抓包
文章插图
三次握手底层逻辑1、Socket
1)Socket 在 linux 系统中是一种特殊的文件 , 因为 linux 系统的理念就是【一切皆文件】 , 是系统内核级的功能;
2)以上定义比较具体 , 可以抽象来理解 , 是一个内核级的用于通信的功能层 , 包含一组接口函数 , 这些函数实际就是操作 socket 文件句柄文件描述符;
一个 TCP 连接由四要素【源IP、源Port、目标IP、目标Port】唯一标识 , 也即 socket 由这四要素唯一确定;
一个 TCP 连接的建立也就是客户端、服务端创建了相对应的一对 socket , 客户端和服务端之间的通信也就是这对 socket 间的通信(物理层面是网卡在发送/接收比特流数据);
3)一个服务与另一个服务建立连接 , 他们的端口是什么呢?
客户端发出请求端口号是随机的 , 服务端是进程监听的端口号;
文章插图
文章插图
2、socket 主要函数介绍
文章插图
文章插图
1、进程通信 , 一个进程只有一个监听 socket , connect socket 是针对一个客户的一个连接的 , 有很多个; 2、connect 函数内部在发起请求前会找系统随机一个端口号; 3、连接建立后 , 客户端发起请求传输数据 , 服务端会直接交给 connect socket 处理 , 不会交给监听 socket 处理;
推荐阅读
- 企业内网神器OpenVPN
- 网络抖动Jitter详解
- 电脑同时连接手机热点及公司内网的设置
- 一文带你详解 Chrome F12 Network 选项
- airpods换设备要重新配对?airpods重新连接新设备_2
- IT程序员必知!TCP/IP为什么会有这么多的致命漏洞?
- 命宫在丙寅详解 命宫壬寅是什么意思
- Python 实现端口扫描
- 低延迟流媒体协议SRT、WebRTC、LL-HLS、UDP、TCP、RTMP详解
- Android 多返回栈技术详解