??????
1.什么是TCP/IP協(xié)議?它由哪些協(xié)議組成?
TCP/IP協(xié)議是互聯(lián)網(wǎng)上最常見的協(xié)議之一,它是一組通信協(xié)議的集合,包括傳輸控制協(xié)議(TCP)、互聯(lián)網(wǎng)協(xié)議(IP)以及其他相關(guān)協(xié)議。TCP/IP協(xié)議是互聯(lián)網(wǎng)上數(shù)據(jù)傳輸?shù)幕A(chǔ),幾乎所有的網(wǎng)絡(luò)應(yīng)用都依賴于它。
TCP/IP協(xié)議由以下幾個(gè)協(xié)議組成:
- IP協(xié)議(Internet Protocol):IP協(xié)議是TCP/IP協(xié)議中最核心的協(xié)議,它負(fù)責(zé)將數(shù)據(jù)包從源地址傳輸?shù)侥康牡刂?。IP協(xié)議是一種無連接的協(xié)議,它不保證數(shù)據(jù)包的可靠傳輸,也不保證數(shù)據(jù)包的順序。
- TCP協(xié)議(Transmission Control Protocol):TCP協(xié)議是一種面向連接的協(xié)議,它提供可靠的數(shù)據(jù)傳輸服務(wù)。TCP協(xié)議負(fù)責(zé)將數(shù)據(jù)分割成小的數(shù)據(jù)段,保證數(shù)據(jù)的可靠傳輸,還能夠控制數(shù)據(jù)的流量和處理網(wǎng)絡(luò)擁塞。
- UDP協(xié)議(User Datagram Protocol):UDP協(xié)議是一種無連接的協(xié)議,它不保證數(shù)據(jù)的可靠傳輸和順序,但是它的傳輸速度比TCP協(xié)議快。
- ARP協(xié)議(Address Resolution Protocol):ARP協(xié)議負(fù)責(zé)將IP地址轉(zhuǎn)換成物理地址,以便數(shù)據(jù)包能夠在網(wǎng)絡(luò)上正確傳輸。
- ICMP協(xié)議(Internet Control Message Protocol):ICMP協(xié)議是一種網(wǎng)絡(luò)管理協(xié)議,它用于傳遞網(wǎng)絡(luò)錯(cuò)誤和狀態(tài)信息,例如ping命令就是通過ICMP協(xié)議實(shí)現(xiàn)的。
- DNS協(xié)議(Domain Name System):DNS協(xié)議用于將域名解析成IP地址,以便數(shù)據(jù)包能夠正確傳輸。
- FTP協(xié)議(File Transfer Protocol):FTP協(xié)議是一種文件傳輸協(xié)議,它用于在網(wǎng)絡(luò)上傳輸文件。
除了上述的協(xié)議外,還有許多其他的協(xié)議,如HTTP協(xié)議、SMTP協(xié)議、POP協(xié)議等等,它們都是基于TCP/IP協(xié)議的,用于實(shí)現(xiàn)不同的網(wǎng)絡(luò)應(yīng)用和服務(wù)。
2.什么是三次握手四次揮手
TCP連接是指在TCP/IP協(xié)議中,建立起兩個(gè)網(wǎng)絡(luò)應(yīng)用程序之間的通信連接。TCP連接提供了可靠的數(shù)據(jù)傳輸,可以保證數(shù)據(jù)的完整性和順序性。TCP連接的建立和斷開過程如下:
2.1.建立連接(三次握手)
TCP連接的建立過程是通過三次握手(Three-way Handshake)來完成的。具體過程如下:
- 第一步:客戶端向服務(wù)器發(fā)送一個(gè)SYN包,表示請求建立連接。SYN包中會(huì)攜帶一個(gè)隨機(jī)生成的序列號(Seq)。
- 第二步:服務(wù)器收到SYN包后,向客戶端發(fā)送一個(gè)SYN+ACK包,表示確認(rèn)建立連接。SYN+ACK包中會(huì)攜帶一個(gè)確認(rèn)號(Ack),該確認(rèn)號等于客戶端的序列號加1,同時(shí)也會(huì)攜帶一個(gè)隨機(jī)生成的序列號。
- 第三步:客戶端收到服務(wù)器的SYN+ACK包后,向服務(wù)器發(fā)送一個(gè)ACK包,表示確認(rèn)建立連接。ACK包中的確認(rèn)號等于服務(wù)器的序列號加1。
第 2 次握手傳回了 ACK,為什么還要傳回 SYN?
- 服務(wù)端傳回發(fā)送端所發(fā)送的 ACK 是為了告訴客戶端:“我接收到的信息確實(shí)就是你所發(fā)送的信號了”,這表明從客戶端到服務(wù)端的通信是正常的?;貍?SYN 則是為了建立并確認(rèn)從服務(wù)端到客戶端的通信。
2.2.三次握手各自出現(xiàn)問題,會(huì)發(fā)生什么結(jié)果?
第一次握手出現(xiàn)問題:第一個(gè)包,即A發(fā)給B的SYN 中途被丟,沒有到達(dá)B
客戶端發(fā)送SYN請求連接報(bào)文,如果遲遲等不到服務(wù)器的請求確認(rèn)報(bào)文段,那么就會(huì)進(jìn)行超時(shí)重傳,具體重傳幾次,要看tcp_syn_retries內(nèi)核參數(shù),一般默認(rèn)是5次。要注意的是,重傳的請求連接報(bào)文的seq序列號字段還是之前的seq,不會(huì)重新生成。
第二次握手出現(xiàn)問題:第二個(gè)包,即B發(fā)給A的SYN +ACK 中途被丟,沒有到達(dá)A
服務(wù)器發(fā)送的第二次握手是連接確認(rèn)報(bào)文段,既包括對第一次握手的ACK確認(rèn),同時(shí)還有SYN字段表示要建立連接,所以第二次握手也可以成為SYN-ACK報(bào)文。所以當(dāng)?shù)诙挝帐謥G失,客戶端遲遲等不到第一次握手的確認(rèn),就會(huì)觸發(fā)超時(shí)重傳機(jī)制,進(jìn)行超時(shí)重傳;服務(wù)器等不到自己SYN連接的確認(rèn),也會(huì)進(jìn)行超時(shí)重傳??蛻舳撕头?wù)器具體的超時(shí)重傳次數(shù)還是由內(nèi)核參數(shù)決定。
第三次握手出現(xiàn)問題:第三個(gè)包,即A發(fā)給B的ACK 中途被丟,沒有到達(dá)B
服務(wù)器得不到ACK報(bào)文,但是ACK報(bào)文丟失,ACK 報(bào)文是不會(huì)有重傳的,當(dāng) ACK 丟失了,就由對方重傳對應(yīng)的報(bào)文。所以當(dāng)?shù)竭_(dá)服務(wù)器的超時(shí)重傳時(shí)間后,服務(wù)器會(huì)超時(shí)重傳第二次報(bào)文,當(dāng)達(dá)到最大超時(shí)重傳次數(shù)還沒得到ACK報(bào)文,服務(wù)器就會(huì)斷開連接。
沒有連接時(shí)為Active狀態(tài)
2.3.斷開連接(四次揮手)
2.3.1TCP連接的斷開過程是通過四次揮手(Four-way Handshake)來完成的。具體過程如下:
- 第一步:客戶端向服務(wù)器發(fā)送一個(gè)FIN包,表示請求關(guān)閉連接。
- 第二步:服務(wù)器收到FIN包后,向客戶端發(fā)送一個(gè)ACK包,表示確認(rèn)關(guān)閉連接。服務(wù)器此時(shí)仍可向客戶端發(fā)送數(shù)據(jù)。
- 第三步:服務(wù)器完成數(shù)據(jù)發(fā)送后,向客戶端發(fā)送一個(gè)FIN包,表示請求關(guān)閉連接。
- 第四步:客戶端收到FIN包后,向服務(wù)器發(fā)送一個(gè)ACK包,表示確認(rèn)關(guān)閉連接。此時(shí)TCP連接徹底關(guān)閉。
總的來說,TCP連接的建立和斷開過程是通過三次握手和四次揮手來完成的。通過這些過程,TCP連接可以提供可靠的數(shù)據(jù)傳輸,保證數(shù)據(jù)的完整性和順序性,是一種非常重要的網(wǎng)絡(luò)協(xié)議。
2.4.用微信聊天的方式來模擬TCP連接的建立和斷開過程
2.4.1TCP連接的建立過程(三次握手):
客戶端:你好,我想和你建立連接,你能收到我的消息嗎?(發(fā)送一個(gè)“打招呼”的消息,表示想要建立連接)
服務(wù)器:嗯,我收到了你的消息,我也想和你建立連接,你能收到我的回復(fù)嗎?(回復(fù)一個(gè)“打招呼”的消息,并詢問能否收到)
客戶端:是的,我收到了你的回復(fù),我們現(xiàn)在可以開始建立連接了。(回復(fù)一個(gè)“確認(rèn)”的消息,表示同意建立連接)
????????此時(shí),客戶端和服務(wù)器之間的TCP連接已經(jīng)建立成功,可以開始進(jìn)行數(shù)據(jù)傳輸了。
2.4.2TCP連接的斷開過程(四次揮手):
客戶端:我想斷開和你的連接了,我不再發(fā)送消息了,但我還能接收你的消息。(發(fā)送一個(gè)“再見”的消息,表示想要斷開連接)
服務(wù)器:好的,我收到了你的消息,我也不會(huì)再發(fā)送消息了,但我還能接收你的消息。(回復(fù)一個(gè)“再見”的消息,表示同意斷開連接)
服務(wù)器:我已經(jīng)把所有的消息都發(fā)送完了,現(xiàn)在準(zhǔn)備關(guān)閉連接。(發(fā)送一個(gè)“好的,我已經(jīng)發(fā)送完消息了”的消息,表示準(zhǔn)備關(guān)閉連接)
客戶端:好的,我收到了你的消息,我也已經(jīng)把所有的消息都發(fā)送完了,現(xiàn)在準(zhǔn)備關(guān)閉連接。(回復(fù)一個(gè)“好的,我已經(jīng)發(fā)送完消息了”的消息,表示同意關(guān)閉連接)
????????此時(shí),客戶端和服務(wù)器之間的TCP連接已經(jīng)斷開成功,不再進(jìn)行數(shù)據(jù)傳輸。
2.5.為什么TCP不是兩次握手或四次握手
2.5.1.二次握手的過程:
- A 發(fā)送同步信號SYN + A's Initial sequence number
- B發(fā)送同步信號SYN+B's Initial sequence number+B's ACK sequence number
????????這里有個(gè)問題,A與B就A的初始序列號達(dá)成了一致,假設(shè)這里是1000.但是B無法知道A是否已經(jīng)收到自己的同步信息,如果這個(gè)同步信息丟失了,A和B就B的初始序列號將無法方達(dá)成一致。
-
兩次握手問題:
- 如果只進(jìn)行兩次握手,即客戶端發(fā)送連接請求,服務(wù)器回復(fù)確認(rèn),看似連接建立了。但這種簡化過程存在嚴(yán)重問題:若服務(wù)器的確認(rèn)消息在網(wǎng)絡(luò)中滯留,客戶端會(huì)誤以為連接已建立,而實(shí)際上服務(wù)器并未意識到這一連接。這可能導(dǎo)致資源浪費(fèi)或數(shù)據(jù)傳輸異常,因此需要第三次握手確認(rèn)雙方都準(zhǔn)備好建立連接。
2.5.2.四次握手過程:
- A發(fā)送同步信息SYN+A’s Initial sequence number
- B 確認(rèn)收到A的同步信號,并記錄 A’s ISN 到本地,命名 B’s ACK sequence number
- B發(fā)送同步信號SYN + B’s Initial sequence number
- A確認(rèn)收到B的同步信號,并記錄 B’s ISN 到本地,命名 A’s ACK sequence number
很顯然2和3 這兩個(gè)步驟可以合并,只需要三次握手,可以提高連接的速度與效率。文章來源:http://www.zghlxwxcb.cn/news/detail-861487.html
-
四次握手問題:文章來源地址http://www.zghlxwxcb.cn/news/detail-861487.html
- 如果采用四次握手,即在斷開連接時(shí)增加額外的握手步驟,會(huì)導(dǎo)致不必要的復(fù)雜性和開銷。TCP的設(shè)計(jì)考慮了在關(guān)閉連接時(shí)需要確保雙方都知道對方已準(zhǔn)備好斷開連接,同時(shí)也需要確認(rèn)數(shù)據(jù)的完整傳輸和狀態(tài)。因此,四次揮手是為了實(shí)現(xiàn)這些目標(biāo),確保數(shù)據(jù)的完整性和連接的正常關(guān)閉。
3.簡單的Java示例
3.1.服務(wù)端代碼:
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try {
// 創(chuàng)建一個(gè)ServerSocket,監(jiān)聽端口9999
ServerSocket serverSocket = new ServerSocket(9999);
// 等待客戶端連接
System.out.println("等待客戶端連接...");
Socket clientSocket = serverSocket.accept();
System.out.println("客戶端已連接");
// 獲取輸入流
BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// 讀取客戶端發(fā)送的數(shù)據(jù)
String inputData = input.readLine();
System.out.println("收到數(shù)據(jù): " + inputData);
// 關(guān)閉連接
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.2.客戶端代碼:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try {
// 連接到服務(wù)器
Socket socket = new Socket("localhost", 9999);
// 獲取輸出流
PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
// 發(fā)送數(shù)據(jù)
String message = "Hello, server!";
System.out.println("發(fā)送數(shù)據(jù): " + message);
output.println(message);
// 關(guān)閉連接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
到了這里,關(guān)于網(wǎng)絡(luò)協(xié)議TCP/IP是什么的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!