# 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,會分配一個文件描述符,此時應用程序才能從內核中拿取數據。
三次握手的抓包過程:
:-: 
此時服務端accept方法還沒有調用(手動阻塞),查看網絡連接情況:
:-: 
可以發現最后并沒有將該連接分配給哪個進程處理,但是連接已經在內核建立了,客戶端可以向服務端發送數據,仍然會被內核接收:
:-: 
之后服務端調用accept方法后將該連接分配給對應的進程處理:
:-: 
同時分配了新的文件描述符:
:-: 
## 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