# Socket
Linux与网络通信相关的命令:
~~~bash
# 查看某个进程的网络连接状况
lsof -p pid
netstat -napt
# 抓取网络通信的数据包,其中eth0为某个特定的网卡,9090为要监听的端口号
tcpdump -nn -i eth0 port 9090
# 查看网卡的MTU
ifconfig
~~~
在TCP协议中,只要经过了三次握手,操作系统就会在内核级别开辟资源,而并一定要服务端调用accept方法来接收连接。只要内核之间开辟了资源,就可以完成面向连接的过程,这个时候应用程序可能还没有收到连接的数据。
因此Socket是内核级别的、Java程序的Socket只是对内核的Socket进行了封装调用。在操作系统内核层面中,只要一个Socket四元组中有一个元素不一样,就可以区分出不同的连接。Socket四元组为:
~~~
Socket=(客户端IP、客户端端口号、服务端IP、服务端端口号)
~~~
所以只要内存够用,实现百万连接时没有什么问题,同时一条连接在Linux系统中就会被抽象成一个文件描述符(调用accept方法之后才分配,但是此时内核中已经有这条连接所占据的资源了)。
**Socket连接过程**
1. 服务端启动,但是还没有accept之前,会在服务端监听指定的端口号、此时查看网络连接状态为'LISTEN'状态。此时没有任何的数据包发送,同时服务端会分配一个TCP类型的文件描述符,这是ServerSocket所占用的文件描述符。
2. 在服务端还没有调用accept之前,此时如果有客户端的连接,此时会有三次握手的过程,同时也会创建新的网络连接,但是该网络连接并没有分配进程和文件描述符,此时,如果客户端向服务端发送数据,则服务端会将数据保留在内核中。
3. 服务端调用accept,会分配一个文件描述符,此时应用程序才能从内核中拿取数据。
三次握手的抓包过程:
:-: ![](https://img.kancloud.cn/3e/15/3e15b1a616c2b1bdf0624aa507420bd1_1688x102.png)
此时服务端accept方法还没有调用(手动阻塞),查看网络连接情况:
:-: ![](https://img.kancloud.cn/81/f3/81f3732250206f7883ebe2eae611620f_951x66.png)
可以发现最后并没有将该连接分配给哪个进程处理,但是连接已经在内核建立了,客户端可以向服务端发送数据,仍然会被内核接收:
:-: ![](https://img.kancloud.cn/7d/55/7d550632c2c70a45053c438e23b13f6f_1140x318.png)
之后服务端调用accept方法后将该连接分配给对应的进程处理:
:-: ![](https://img.kancloud.cn/a0/e7/a0e701ca28bbea6d2d23545cef330800_932x61.png)
同时分配了新的文件描述符:
:-: ![](https://img.kancloud.cn/58/9b/589bc8eb18282d56725896f1821c3b71_1390x44.png)
## Socket连接参数
1. BACK_LOG:如果客户端的连接超过该值+1,则该连接会显示“SYN_RECV”状态,表示服务端没有向客户端确认。
2. SO_TIMEOUT:设置accept的超时时间,0表示永久阻塞。
3. NO_DELAY:表示是否开启优化算法,设置为true时有多少数据就发送多少数据。
4. KeepAlive:保持连接的时间。
- 第一章 Java基础
- ThreadLocal
- Java异常体系
- Java集合框架
- List接口及其实现类
- Queue接口及其实现类
- Set接口及其实现类
- Map接口及其实现类
- JDK1.8新特性
- Lambda表达式
- 常用函数式接口
- stream流
- 面试
- 第二章 Java虚拟机
- 第一节、运行时数据区
- 第二节、垃圾回收
- 第三节、类加载机制
- 第四节、类文件与字节码指令
- 第五节、语法糖
- 第六节、运行期优化
- 面试常见问题
- 第三章 并发编程
- 第一节、Java中的线程
- 第二节、Java中的锁
- 第三节、线程池
- 第四节、并发工具类
- AQS
- 第四章 网络编程
- WebSocket协议
- Netty
- Netty入门
- Netty-自定义协议
- 面试题
- IO
- 网络IO模型
- 第五章 操作系统
- IO
- 文件系统的相关概念
- Java几种文件读写方式性能对比
- Socket
- 内存管理
- 进程、线程、协程
- IO模型的演化过程
- 第六章 计算机网络
- 第七章 消息队列
- RabbitMQ
- 第八章 开发框架
- Spring
- Spring事务
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 数据库
- Mysql
- Mysql中的索引
- Mysql中的锁
- 面试常见问题
- Mysql中的日志
- InnoDB存储引擎
- 事务
- Redis
- redis的数据类型
- redis数据结构
- Redis主从复制
- 哨兵模式
- 面试题
- Spring Boot整合Lettuce+Redisson实现布隆过滤器
- 集群
- Redis网络IO模型
- 第十章 设计模式
- 设计模式-七大原则
- 设计模式-单例模式
- 设计模式-备忘录模式
- 设计模式-原型模式
- 设计模式-责任链模式
- 设计模式-过滤模式
- 设计模式-观察者模式
- 设计模式-工厂方法模式
- 设计模式-抽象工厂模式
- 设计模式-代理模式
- 第十一章 后端开发常用工具、库
- Docker
- Docker安装Mysql
- 第十二章 中间件
- ZooKeeper