1疮鲫、tcp如何保證傳輸?shù)目煽啃?/p>
合理分片:將數(shù)據(jù)分割成最適合tcp發(fā)送的數(shù)據(jù)塊
超時重傳:tcp發(fā)送端發(fā)送數(shù)據(jù)后會啟動一個計時器淑翼,當(dāng)計時器超過某個時間沒有收到接收端的確認(rèn)就,重新發(fā)送數(shù)據(jù)上鞠。
確認(rèn):tcp接收端接收到數(shù)據(jù)后發(fā)送確認(rèn)給發(fā)送端。
校驗:tcp接收到數(shù)據(jù)檢驗發(fā)現(xiàn)數(shù)據(jù)有誤绊起,丟棄報文段,不給出相應(yīng)燎斩,發(fā)送端會超時重傳
失序重排:tcp是用ip數(shù)據(jù)報傳送數(shù)據(jù)的虱歪,ip數(shù)據(jù)報到達(dá)會失序,因此數(shù)據(jù)到達(dá)也會失序栅表。Tcp會對失序的數(shù)據(jù)重新排列笋鄙。
重復(fù)丟棄:對收到的重復(fù)數(shù)據(jù)丟棄掉。
流量控制:當(dāng)接收端來不及處理發(fā)送端發(fā)送的數(shù)據(jù)怪瓶,能提示發(fā)送端降低發(fā)送的速率萧落,防止包丟失。
擁塞控制:當(dāng)網(wǎng)絡(luò)擁塞時,減少數(shù)據(jù)的發(fā)送找岖。
2陨倡、Socket 編程
- 使用Socket 對象進(jìn)行通信、客戶端實例化一個Socket對象(指定服務(wù)器名稱和端口號請求連接)许布、服務(wù)器端實例化一個ServerSocket 對象(使用accept()方法連接客戶端給定的端口)
套接字使用TCP提供了兩臺計算機(jī)之間的通信機(jī)制兴革。 客戶端程序創(chuàng)建一個套接字,并嘗試連接服務(wù)器的套接字蜜唾。
當(dāng)連接建立時杂曲,服務(wù)器會創(chuàng)建一個 Socket 對象≡啵客戶端和服務(wù)器現(xiàn)在可以通過對 Socket 對象的寫入和讀取來進(jìn)行通信擎勘。
java.net.Socket 類代表一個套接字,并且 java.net.ServerSocket 類為服務(wù)器程序提供了一種來監(jiān)聽客戶端泌霍,并與他們建立連接的機(jī)制货抄。
以下步驟在兩臺計算機(jī)之間使用套接字建立TCP連接時會出現(xiàn):
服務(wù)器實例化一個 ServerSocket 對象,表示通過服務(wù)器上的端口通信朱转。
服務(wù)器調(diào)用 ServerSocket 類的 accept() 方法,該方法將一直等待积暖,直到客戶端連接到服務(wù)器上給定的端口藤为。
服務(wù)器正在等待時,一個客戶端實例化一個 Socket 對象夺刑,指定服務(wù)器名稱和端口號來請求連接缅疟。
Socket 類的構(gòu)造函數(shù)試圖將客戶端連接到指定的服務(wù)器和端口號。如果通信被建立遍愿,則在客戶端創(chuàng)建一個 Socket 對象能夠與服務(wù)器進(jìn)行通信存淫。
在服務(wù)器端,accept() 方法返回服務(wù)器上一個新的 socket 引用沼填,該 socket 連接到客戶端的 socket桅咆。
連接建立后,通過使用 I/O 流在進(jìn)行通信坞笙,每一個socket都有一個輸出流和一個輸入流岩饼,客戶端的輸出流連接到服務(wù)器端的輸入流,而客戶端的輸入流連接到服務(wù)器端的輸出流薛夜。
TCP 是一個雙向的通信協(xié)議籍茧,因此數(shù)據(jù)可以通過兩個數(shù)據(jù)流在同一時間發(fā)送.以下是一些類提供的一套完整的有用的方法來實現(xiàn) socket。