java 网络编程 博客园_java网络编程
1、計算機網絡基礎
OSI參考模型(開放系統互連參考模型):
物理層:物理層處于OSI的最底層,是整個開放系統的基礎。物理層涉及通信信道上傳輸的原始比特流(bits),它的功能主要是為數據端設備提供傳送數據的通路以及傳輸數據
數據鏈路層:數據鏈路層的主要任務是實現計算機網絡中相鄰節點之間的可靠傳輸,把原始的、有差錯的物理傳輸線路加上數據鏈路協議以后,構成邏輯上可靠的數據鏈路。需要完成的功能有鏈路管理、成幀、差錯控制以及流量控制等。其中成幀是對物理層的原始比特流進行界定,數據鏈路層也能夠對幀的丟失進行處理。
網絡層:網絡層涉及源主機節點到目的主機節點之間可靠的網絡傳輸,它需要完成的功能主要包括路由選擇、網絡尋址、流量控制、擁塞控制、網絡互連等。
傳輸層:傳輸層起著承上啟下的作用,涉及源端節點到目的端節點之間可靠的信息傳輸。傳輸層需要解決跨越網絡連接的建立和釋放,對底層不可靠的網絡,建立連接時需要三次握手,釋放連接時需要四次揮手。
會話層和表示層:會話層的主要功能是負責應用程序之間建立、維持和中斷會話,同時也提供對設備和結點之間的會話控制,協調系統和服務之間的交流,并通過提供單工、半雙工和全雙工3種不同的通信方式,使系統和服務之間有序地進行通信。
表示層關心所傳輸數據信息的格式定義,其主要功能是把應用層提供的信息變換為能夠共同理解的形式,提供字符代碼、數據格式、控制信息格式、加密等的統一表示。
應用層
應用層為OSI的最高層,是直接為應用進程提供服務的。其作用是在實現多個系統應用進程相互通信的同時,完成一系列業務處理所需的服務。
TCP/IP參考模型(傳輸控制協議/因特網互聯協議)
TCP/IP,即Transmission Control Protocol/Internet Protocol的簡寫,中譯名為傳輸控制協議/因特網互聯協議,是Internet最基本的協議、Internet國際互聯網絡的基礎。
TCP/IP協議定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。TCP/IP參考模型采用4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求,這4個層次分別是:網絡接口層、互聯網層(IP層)、傳輸層(TCP層)、應用層。
網絡接口層(數據鏈路層):網絡接口層對應著OSI物理層和數據鏈路層。
互聯網層(IP層)(網絡層):互聯網層是整個TCP/IP協議棧的核心。它的功能是把分組發往目標網絡或主機。同時,為了盡快地發送分組,可能需要沿不同的路徑同時進行分組傳遞。因此,分組到達的順序和發送的順序可能不同,這就需要上層必須對分組進行排序。互聯網層除了需要完成路由的功能外,也可以完成將不同類型的網絡(異構網)互連的任務。除此之外,互聯網層還需要完成擁塞控制的功能。
傳輸層(TCP層):TCP層負責在應用進程之間建立端到端的連接和可靠通信,它只存在與端節點中。TCP層涉及兩個協議,TCP和UDP。其中,TCP協議提供面向連接的服務,提供按字節流的有序、可靠傳輸,可以實現連接管理、差錯控制、流量控制、擁塞控制等。UDP協議提供無連接的服務,用于不需要或無法實現面向連接的網絡應用中。
應用層:應用層為Internet中的各種網絡應用提供服務
TCP報文段格式:TCP報文段包括協議首部和數據兩部分,協議首部的固定部分有20個字節,首部的固定部分后面是選項部分。
TCP報文段
下面是報文段首部各個字段的含義。
1.源端口號以及目的端口號,各占2個字節,端口是傳輸層和應用層的服務接口,用于尋找發送端和接收端的進程,一般來講,通過端口號和IP地址,可以唯一確定一個TCP連接,在網絡編程中,通常被稱為一個socket接口。
2.序號,占4字節,用來標識從TCP發送端向TCP接收端發送的數據字節流。
3.確認序號,占4字節,包含發送確認的一端所期望收到的下一個序號,因此,確認序號應該是上次已經成功收到數據字節序號加1
.
4.數據偏移,占4位,用于指出TCP首部長度,若不存在選項,則這個值為20字節,數據偏移的最大值為60字節。
5.保留字段占6位,暫時可忽略,值全為0
6.標志位
URG(緊急) : 為1時表明緊急指針字段有效
ACK(確認):為1時表明確認號字段有效
PSH(推送):為1時接收方應盡快將這個報文段交給應用層
RST(復位):為1時表明TCP連接出現故障必須重建連接
SYN(同步):在連接建立時用來同步序號
FIN (終止): 為1時表明發送端數據發送完畢要求釋放連接
7.接收窗口占2個字節,用于流量控制和擁塞控制,表示當前接收緩沖區的大小。在計算機網絡中,通常是用接收方的接收能力的大小來控制發送方的數據發送量。TCP連接的一端根據緩沖區大小確定自己的接收窗口值,告訴對方,使對方可以確定發送數據的字節數。
8.校驗和占2個字節,范圍包括首部和數據兩部分。
9.選項是可選的,默認情況是不選。
三次握手與四次揮手
1、三次握手
置位概念:根據TCP的包頭字段,存在3個重要的標識ACK、SYN、FIN
ACK:表示驗證字段
SYN:位數置1,表示建立TCP連接
FIN:位數置1,表示斷開TCP連接
第一次握手
客戶機發送連接請求報文段到服務器,并進入SYN_SENT狀態,等待服務器確認。(SYN = 1,seq=x)。
第二次握手
服務器收到連接請求報文,如果同意建立連接,向客戶機發回確認報文段,并為該TCP連接分配TCP緩存和變量。(SYN=1,ACK=1,seq=y,ack=x+1)。
第三次握手
客戶機收到服務器的確認報文段后,向服務器給出確認報文段,并且也要給該連接分配緩存和變量。此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。(ACK=1,seq=x+1,ack=y+1)。
TCP三次握手為什么不能是兩次?
主要是防止兩次握手情況下已經失效的連接請求報文段突然又傳送到服務端而產生錯誤。例如,客戶機A向服務器B發送TCP連接請求,第一個連接請求報文在網絡的某個節點長時間滯留,A超時后認為報文丟失,于是再重傳一次連接請求,B收到后建立連接。數據傳輸完畢后雙方斷開連接,而這時之前滯留的連接請求到達了服務端B,而B認為A又發來連接請求。如果兩次握手建立連接,A并無連接請求,造成B的資源浪費。
2、四次揮手
1、TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送。
2、服務器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號。
3、服務器關閉客戶端的連接,發送一個FIN給客戶端。
4、客戶端發回ACK報文確認,并將確認序號設置為收到序號加1。
為什么連接的時候是三次握手,關閉的時候卻是四次握手?
由于TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務后就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數據流動,一個TCP連接在收到一個FIN后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
Socket
簡單的例子
server端
public static void main(String[] args) throws IOException {
System.out.println("等待客戶端連接。。。");
//創建一個ServerSocket
ServerSocket ss=new ServerSocket(888);
ss.setSoTimeout(100000000);
Socket server = ss.accept();
System.out.println("遠程主機地址:" + server.getRemoteSocketAddress());
//接受來自client端發來的數據
DataInputStream in = new DataInputStream(server.getInputStream());
//打印client發來的數據
System.out.println(in.readUTF());
//發給client的數據
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("謝謝連接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
server.close();
}
client端
public static void main(String[] args) throws IOException {
Socket client = new Socket("localhost", 888);
System.out.println("遠程主機地址:" + client.getRemoteSocketAddress());
//發數據給server端
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
//接受來自server端的數據
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
//打印server端發來的數據
System.out.println("服務器響應: " + in.readUTF());
client.close();
}
總結
以上是生活随笔為你收集整理的java 网络编程 博客园_java网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比亚迪宋 L 新增际云青外观,11 月
- 下一篇: 微软 Win11 23590 预览版隐藏