在網絡技術中,端口(Port)有好幾種意思。集線器、交換機、路由 器的端口指的是鏈接其餘網絡設備的接口,如RJ-45端口、Serial端口等。咱們 這裏所指的端口不是指物理意義上的端口,而是特指TCP/IP協議中的端口,是邏 輯意義上的端口。 服務器
那麼TCP/IP協議中的端口指的是什麼呢?若是把IP地址比做一間房子 ,端口就是出入這間房子的門。真正的房子只有幾個門,可是一個IP地址的端口 能夠有65536個之多!端口是經過端口號來標記的,端口號只有整數,範圍是從0 到65535。 網絡
端口有什麼用呢?咱們知道,一臺擁有IP地址的主機能夠提供許多服 務,好比Web服務、FTP服務、SMTP服務等,這些服務徹底能夠經過1個IP地址來 實現。那麼,主機是怎樣區分不一樣的網絡服務呢?顯然不能只靠IP地址,由於IP 地址與網絡服務的關係是一對多的關係。其實是經過「IP地址+端口號」來區 分不一樣的服務的。框架
簡言之:socket
---端口是爲了將同一個電腦上的不一樣程序進行隔離。ide
---端口是找電腦上的程序網站
---IP是找電腦spa
端口的範圍:1-65535orm
系統經常使用1-1024視頻
開發人員經常使用:8000/8001....blog
簡單介紹OSI的分層、做用、封裝
開發人員視角:本身代碼+框架
應用層 |
使用軟件。 |
打開軟件或網站 |
表示層 |
看到數據,如圖片和視頻。 |
生產數據:szwwd |
會話層 |
保持登陸或連接狀態。 |
應用偷偷攜帶一點其餘數據:令牌 19rRNAwf8GVe6xyT9kJPIu5SlQc |
socket模塊:
傳輸層 |
TCP/UDP |
[TCP][szwwd|19rRNAwf8GVe6xyT9kJPIu5SlQc] |
網絡層 |
IP |
【IP】【[TCP][szwwd|19rRNAwf8GVe6xyT9kJPIu5SlQc]】 |
數據鏈路層 |
MAC |
[MAC][【IP】【[TCP][szwwd|19rRNAwf8GVe6xyT9kJPIu5SlQc]】] |
物理層 |
|
將數據轉換成電信號發送 |
簡單形象的介紹:
SYN_SENT:狀態
client.connect((....))
客戶端 |
服務端 |
我能打你嗎 |
|
|
來呀來呀 |
好的,我這就來 |
|
client.send('發送數據')
收發數據 收發數據
client.close() 或 conn.close()
我要斷開鏈接 |
|
|
斷開就斷開,等我處理一些手頭的事情 |
|
... |
|
我處理完了,斷開吧。 |
拜拜 |
|
三次握手:
數據傳輸完畢後,雙方均可釋放鏈接。最開始的時候,客戶端和服務器都是處於ESTABLISHED狀態,而後客戶端主動關閉,服務器被動關閉。服務端也能夠主動關閉,一個流程。
客戶端進程發出鏈接釋放報文,而且中止發送數據。釋放數據報文首部,FIN=1,其序列號爲seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即便不攜帶數據,也要消耗一個序號。服務器收到鏈接釋放報文,發出確認報文,ACK=1,ack=u+1,而且帶上本身的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,可是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送鏈接釋放報文(在這以前還須要接受服務器發送的最後的數據)。服務器將最後的數據發送完畢後,就向客戶端發送鏈接釋放報文,FIN=1,ack=u+1,因爲在半關閉狀態,服務器極可能又發送了一些數據,假定此時的序列號爲seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。客戶端收到服務器的鏈接釋放報文後,必須發出確認,ACK=1,ack=w+1,而本身的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP鏈接尚未釋放,必須通過2∗∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。服務器只要收到了客戶端發出的確認,當即進入CLOSED狀態。一樣,撤銷TCB後,就結束了此次的TCP鏈接。能夠看到,服務器結束TCP鏈接的時間要比客戶端早一些。