TCP/IP采用分層結(jié)構(gòu)冒嫡,上層委托下層:
瀏覽器郵件等一般應(yīng)用程序收發(fā)數(shù)據(jù)時(shí)使用TCP四苇,DNS查詢等收發(fā)較短的控制數(shù)據(jù)時(shí)使用UDP。
協(xié)議棧的下半部分是IP協(xié)議月腋,IP協(xié)議控制網(wǎng)絡(luò)包收發(fā)操作的部分榆骚,在互聯(lián)網(wǎng)上傳輸數(shù)據(jù)時(shí),數(shù)據(jù)會被切分成一個(gè)個(gè)的網(wǎng)絡(luò)包妓肢,而將網(wǎng)絡(luò)包發(fā)送給通信對象的操作就是由IP來完成。IP中還包括ICMP協(xié)議和ARP協(xié)議纲缓,ICMP:用于告知網(wǎng)絡(luò)包傳送過程中產(chǎn)生的錯(cuò)誤以及各種控制信息喊废,ARP用于根據(jù)IP地址查詢相應(yīng)的以太網(wǎng)MAC地址。
套接字的實(shí)體就是通信控制信息
協(xié)議棧在執(zhí)行操作時(shí)會參閱這些控制信息工闺。協(xié)議棧是根據(jù)套接字中記錄的控制信息來工作的瓣蛀。
調(diào)用Socket時(shí)的操作
- 申請創(chuàng)建套接字。
-
協(xié)議棧會分配用于存放套接字的所需的內(nèi)存空間遍搞。
圖片發(fā)自簡書App
創(chuàng)建套接字時(shí)器腋,首先分配一個(gè)套接字所需的內(nèi)存空間钩杰,然后向其寫入初始狀態(tài)诊县。
連接服務(wù)器
套接字剛創(chuàng)建完成的時(shí)候,里面并沒有存放任何數(shù)據(jù)避除,也不知道到通信對象是誰胸嘁。
因此,我們需要把服務(wù)器的IP地址和端口號等信息告知協(xié)議棧群井,這是連接的操作目的之一
服務(wù)器不知道要跟誰通信毫胜,因此需要讓客戶端向服務(wù)器告知必要的信息。
因此酵使,客戶端向服務(wù)器傳達(dá)開始通信的請求,也是連接操作的目的目的之一
連接實(shí)際上是通信雙方交換控制信息样屠。當(dāng)執(zhí)行數(shù)據(jù)收發(fā)操作時(shí)搓劫,還需要一塊用來臨時(shí)存儲要收發(fā)的數(shù)據(jù)的內(nèi)存空間混巧,這塊內(nèi)存空間稱為緩沖區(qū)。
應(yīng)用程序傳遞來的信息以及從通信對象接收到的信息都會保存在套接字中
通信操作中使用的控制信息分為兩類:
頭部中記錄的信息(如:TCP頭部)
套接字中記錄的信息 (如:IP地址和端口號)
連接操作的實(shí)際過程
這個(gè)過程是從App調(diào)用Socket庫的connect
開始。
connect (<描述符>傍衡,<服務(wù)器IP地址和端口號>)
接下來,這些信息傳遞給協(xié)議棧中的TCP模塊蛙埂,然后绣的,TCP模塊會與該服務(wù)器的TCP模塊交換控制信息:
- 客戶端創(chuàng)建一個(gè)包含開始數(shù)據(jù)收發(fā)操作的控制信息的頭部欲账。頭部包含很多字段芭概,這里重點(diǎn)關(guān)注發(fā)送方和接收方的端口號,然后將SYN比特設(shè)置為1罢洲。此外還需設(shè)置適當(dāng)?shù)男蛱柡痛翱诖笮 ?/li>
- 當(dāng)TCP頭部創(chuàng)建好之后,接下來TCP模塊會將信息傳遞給IP模塊并委托它發(fā)送殿较。
- 服務(wù)器的IP模塊接收到后桩蓉,將數(shù)據(jù)傳遞給TCP模塊。服務(wù)器的TCP模塊根據(jù)TCP的頭部信息找到端口號對應(yīng)的套接字帚戳,找到之后儡首,在套接字中寫入相應(yīng)信息,并將狀態(tài)改為正在連接蔬胯。
- 上述操作完成后,服務(wù)器會返回響應(yīng)产场。整個(gè)過程和客戶端一樣(發(fā)送方和接收方的端口號舞竿,然后將SYN比特設(shè)置為1),除此之外确徙,還需將ACK標(biāo)志位設(shè)置為1执桌,表示已接收到網(wǎng)絡(luò)包鄙皇。(如果因?yàn)槟承┰蚍?wù)器不接受連接伴逸,那么將不設(shè)置SYN膘壶,而是將RST設(shè)置為1)
- 然后網(wǎng)絡(luò)包返回到客戶端博烂,如果SYN為1漱竖,表示連接成功,這時(shí)會向套接字中寫入服務(wù)器的IP地址和端口號等信息馍惹,同時(shí)將狀態(tài)設(shè)為連接完畢万矾。
- 到這里客戶端的操作已經(jīng)完成悼吱。(其實(shí)還剩下最后一個(gè)步驟良狈,客戶端將ACK設(shè)為1并發(fā)回給服務(wù)器薪丁,告訴服務(wù)器剛才的響應(yīng)包已收到)。當(dāng)服務(wù)器收到這個(gè)返回包時(shí)严嗜,連接操作才算全部完成。
建立連接之后茄蚯,協(xié)議棧的連接操作就結(jié)束了睦优,也就是說connect操作執(zhí)行完畢,控制流程交給App