tcp和udp協議都位於osi七層模型中的傳輸層,處於ip協議的上一層,隸屬於tcp/ip協議簇,如果你不清楚tcp/ip協議,請看我寫的另外一篇文章:android網路程式設計(二):tcp/ip協議詳解
tcp和tcp是傳輸層的兩個主要協議,互為補充,都是用於處理資料報。udp支援無連線傳輸,是不可靠的,但是傳輸效能好;tcp是面向連線的,可靠性更高,用得也最多。
udp協議全稱是使用者資料報協議,在網路中它與tcp協議一樣用於處理資料報,是一種無連線的協議。udp有不提供資料報分組、組裝和不能對資料報進行排序的缺點,也就是說,當報文傳送之後,是無法得知其是否安全完整到達的。
udp應用場景:
1.面向資料報方式
2.網路資料大多為短訊息
3.擁有大量client
4.對資料安全性無特殊要求
5.網路負擔非常重,但對響應速度要求高
傳輸控制協議(tcp,transmission control protocol)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。
應用層向tcp層傳送用於網間傳輸的、用8位位元組表示的資料流,然後tcp把資料流分割槽成適當長度的報文段之後tcp把結果包傳給ip層,由它來通過網路將包傳送給接收端實體的tcp層。tcp為了保證不發生丟包,就給每個包乙個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回乙個相應的確認(ack);如果傳送端實體在合理的往返時延(rtt)內未收到確認,那麼對應的資料報就被假設為已丟失將會被進行重傳。tcp用乙個校驗和函式來檢驗資料是否有錯誤;在傳送和接收時都要計算校驗和。
tcp頭部訊息
源、目標埠號字段:佔16位元。tcp協議通過使用」埠」來標識源端和目標端的應用程序。埠號可以使用0到65535之間的任何數字。在收到服務請求時,作業系統動態地為客戶端的應用程式分配埠號。在伺服器端,每種服務在」眾所周知的埠」(well-know port)為使用者提供服務。
順序號字段:佔32位元。用來標識從tcp源端向tcp目標端傳送的資料字節流,它表示在這個報文段中的第乙個資料位元組。
頭部長度字段:佔4位元。給出頭部佔32位元的數目。沒有任何選項欄位的tcp頭部長度為20位元組;最多可以有60位元組的tcp頭部。
標誌位欄位(u、a、p、r、s、f):佔6位元。各位元的含義如下:
◆urg:緊急指標(urgent pointer)有效。
◆ack:為1時,確認序號有效。
◆psh:為1時,接收方應該盡快將這個報文段交給應用層。
◆rst:為1時,重建連線。
◆syn:為1時,同步程式,發起乙個連線。
◆fin:為1時,傳送端完成任務,釋放乙個連線。
視窗大小字段:佔16位元。此欄位用來進行流量控制。單位為位元組數,這個值是本機期望一次接收的位元組數。
tcp校驗和字段:佔16位元。對整個tcp報文段,即tcp頭部和tcp資料進行校驗和計算,並由目標端進行驗證。
緊急指標字段:佔16位元。它是乙個偏移量,和序號欄位中的值相加表示緊急資料最後乙個位元組的序號。
選項字段:佔32位元。可能包括」視窗擴大因子」、」時間戳」等選項。
tcp是網際網路中的傳輸層協議,使用三次握手協議建立連線。當主動方發出syn連線請求後,等待對方回答 syn + ack ,並最終對對方的 syn 執行 ack 確認。這種建立連線的方法可以防止產生錯誤的連線,tcp 使用的流量控制協議是可變大小的滑動視窗協議。
tcp三次握手的過程如下:
客戶端傳送 syn(seq=x)報文給伺服器端,進入 syn_send 狀態。
伺服器端收到 syn 報文,回應乙個 syn (seq=y)ack(ack=x+1)報文,進入 syn_recv 狀態。
客戶端收到伺服器端的 syn 報文,回應乙個 ack(ack=y+1)報文,進入 established 狀態。
三次握手完成,tcp客戶端和伺服器端成功地建立連線,可以開始傳輸資料了。
三次握手可以簡單理解為a、b兩人開始連麥開黑:
a:聽到嗎? (第一次握手)
b:聽得到,你能聽到我的聲音嗎? (第二次握手)
a:能聽到。 (第三次握手)
ok,麥沒問題,開始遊戲
客戶端程序發出連線釋放報文,並且停止傳送資料。釋放資料報文首部,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連線的時間要比客戶端早一些。
四次揮手可以簡單地理解為a、b兩人結束對話:
a:我已經講完了。 (第一次揮手)
b:知道啦。 (第二次揮手)
b:但是我還沒講完,我跟你講哦%#¥#¥%#… (a在聽b講完)
b:我講完啦。 (第三次揮手)
a:收到。 (第四次揮手)
然後各回各家,各找各媽
android網路程式設計(二):tcp/ip協議詳解
android網路程式設計(四):socket原理
目錄:android網路程式設計系統性學習目錄
TCP網路程式設計
基於tcp 通訊模型 由上圖可以得出tcp通訊的步驟如下 服務端 1 建立乙個socket,用函式socket 2 繫結ip位址 埠等資訊到socket上,用函式bind 3 設定允許的最大連線數,用函式listen 4 等待來著客戶端的連線請求,用函式accept 5 收發資料,用函式send 和...
網路程式設計 TCP
客戶端 1.建立客戶端的socket服務,指定目的主機和埠 2.為了傳送資料,應該獲取socket中的輸出流 3.獲取socket中的輸入流來獲取服務端的反饋資料 4.關閉資源 服務端 1.建立服務端的serversocket服務,並監聽乙個埠 2.通過accept方法 等待並獲取連線過來的客戶端s...
網路程式設計 TCP
即有傳送緩衝區 接收緩衝區,傳送次數和接收次數不一定對等。報頭長,成本高,需要搭載更多的資料。1.三次握手 通過對ack的確認,建立可靠連線。有超時重傳機制 2.四次揮手 有可能伺服器處理資料的時間較短,即三次揮手 3.狀態圖 2 保證遲來的資料報能被識別並丟棄 4.tcp狀態轉移過程 5.tcp報...