數據包的狀態
[root@m01 ~]$netstat -anptul
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7127/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7212/master
tcp 0 52 10.0.0.61:22 10.0.0.1:58421 ESTABLISHED 7808/sshd: root@pts
tcp 0 0 10.0.0.61:22 10.0.0.1:54035 ESTABLISHED 7390/sshd: root@pts
tcp6 0 0 :::21 :::* LISTEN 7133/vsftpd
tcp6 0 0 :::22 :::* LISTEN 7127/sshd
tcp6 0 0 ::1:25 :::* LISTEN 7212/master
連接狀態 | 說明 | type |
---|---|---|
NEW | 主機向遠程機器發時一個連接請求,這個數據包狀態是NEW | STREAM/DGRAM |
ESTABLISHED | 當聯接建立之後,遠程主機和你主機通信數據狀態爲ESTABLISHED | STREAM/DGRAM |
RELATED | 像ftp這樣的服務,用21端口傳送命令,而用20端口(port模式)或其他端口(PASV模式)傳送數據。在已有21端口上建立好連接後發送命令,用20傳送的數據,狀態是RELATED | STREAM/DGRAM |
LISTEN | 正在監聽狀態,還未建立連接 | STREAM/DGRAM |
CONNECTED | 已連接的狀態 | STREAM/DGRAM |
iptables設置數據狀態規則
通過IP tables防火牆規則來理解數據包的狀態連接
主動連接:向遠程主機主動發起連接,數據包的狀態是NEW,再接收到的數據包狀態就是ESTABLISHED。
1 iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT
2 iptables -A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT
3 iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
4 iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
netstat查看服務的連接狀態
常見參數 | 功能(socket,進程,服務,端口) |
---|---|
a | 顯示所有端口(監聽和監聽的) |
t | 僅顯示tcp的端口連接 |
u | 僅顯示udp相關的端口連接 |
l | 僅列出處於listen(監聽)服務狀態的socket |
p | 現實建立連接的程序名稱和進程ID |
r | 現實路由信息,路由表 |
e | 顯示擴展信息 |
s | 按照協議來統計程序連接的數據狀態 |
c | 每隔一段時間執行netstat命令 |
i | 顯示網絡接口列表,像是ifconfig使用netstat -ie |
#兩秒執行一次netstat查詢TCP協議連接的進程
[root@m01 ~]$netstat -tup -c 2
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 52 localhost:ssh localhost:54035 ESTABLISHED 7390/sshd: root@pts
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost:ssh localhost:54035 ESTABLISHED 7390/sshd: root@pts
傳輸層TCP/UDP
點對點的連接:通信雙方在同一鏈路上
端對端的連接:通信雙方通過電纜進行通信
TCP:面向連接,提供服務前建立專門的傳輸連接,並且這條連接可管理,在需要或通信結束時進行拆除。面向連接的傳輸服務是可靠的傳輸服務,提供擁塞控制、差錯控制和流量控制。
其建立在不可靠的分組傳輸服務上,可能出現丟失、亂序、延遲、重複等等問題,因此,TCP必須使用三次握手、超時與重傳功能。
UDP:無連接,直接發送,不管是否送達,盡力而爲,速度比較快
socket端到端的連接
區分不同應用進程間的網絡通信和連接,實現數據傳輸的併發服務,TCP/IP通信中,應用程序把數據傳送給socket,由socket通過傳輸層向下提交給網路驅動程序並向網絡上發送出去。計算機從網絡上收到與該socket綁定IP地址和端號相關的數據後,由網絡驅動程序通過傳輸層向上提交給應用層的socket,最後應用程序從socket中提取所要接受的數據。
通過簡單的python代碼來說明socket數據傳輸
#server
import socket #導入socket模塊
sk = socket.socket() #引用socket函數
sk.bind(("127.0.0.1",8080)) #綁定IP地址和端口
sk.listen() #監聽
conn,address = sk.accept() #獲取連接
conn.send("哈嘍客戶端,我是server".encode("utf-8")) #向客戶端發送數據
msg = conn.recv(1024).decode("utf-8") #接收客戶端信息
print(msg)
sk.close()
#client
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",8080)) #連接到服務器端
msg = sk.recv(1024).decode("utf-8") #接收服務端數據
sk.send("你好server,我是client".encode("utf-8")) #回覆服務端消息
print(msg)
sk.close()
TCP socket.socket():
設置端口和地址;send()向服務器發送數據;recv()接受服務器數據;close()關閉套接字
UDP socket.socket(type=socket.SOCK_DGRAM):
設置端口和地址;sendto()向服務器發送數據;recvfrom()接受服務器數據;close()關閉套接字
圖例說明:
TCP連接狀態
狀態 | 描述 |
---|---|
CLOSED | 呈阻塞、關閉狀態,表示主機當前沒有活動的傳輸連接或者正在進行傳輸連接 |
LISTEN | 呈監聽狀態,表示服務器正在等待新的傳輸連接進入 |
SYN RCVD | 表示主機已經收到一個傳輸連接請求,但尚未確認 |
SYN SENT | 表示主機已經發出一個傳輸連接請求,等待對方確認 |
ESTABLISHED | 傳輸連接建立,通信雙方進入正常的數據傳輸狀態 |
FIN WAIT 1 | (主動關閉)主機已經發送關閉連接請求,等待對方確認 |
FIN WAIT2 | (主動關閉)主機已經收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求 |
TIMED WAIT | 完成雙向傳輸連接關閉,等待所有分組消失 |
CLOSING | 雙方同時嘗試關閉傳輸連接,等待對方確認 |
CLOSE WAIT | (被動關閉)收到對方發來的關閉傳輸連接請求,並已確認 |
LAST ACK | (被動關閉)等待最後一個關閉傳輸連接確認,並等待所有分組消失 |