Socket编程实践(1) --TCP/IP简述
ISO的OSI
? ? OSI(open?system?interconnection)開放系統(tǒng)互聯(lián)模型是由ISO國際標(biāo)準(zhǔn)化組織定義的網(wǎng)絡(luò)分層模型,共七層,?從下往上為:
OSI七層參考模型 | |
物理層(Physical?Layer) | 物理層定義了所有電子及物理設(shè)備的規(guī)范,為上層的傳輸提供了一個(gè)物理介質(zhì),本層中數(shù)據(jù)傳輸?shù)膯挝粸楸忍?#xff08;bit/二進(jìn)制位)。屬于本層定義的規(guī)范有EIA/TIA?RS-232、RJ-45等,實(shí)際使用中的設(shè)備如網(wǎng)卡屬于本層。 |
數(shù)據(jù)鏈路層(Data?Link?Layer) | 對(duì)物理層收到的比特流進(jìn)行數(shù)據(jù)成幀。提供可靠的數(shù)據(jù)傳輸服務(wù),實(shí)現(xiàn)無差錯(cuò)數(shù)據(jù)傳輸。在數(shù)據(jù)鏈路層中數(shù)據(jù)的單位為幀(frame)。屬于本層定義的規(guī)范有HDLC、PPP、STP等,實(shí)際使用中的設(shè)備如switch交換機(jī)屬于本層。 |
網(wǎng)絡(luò)層(Network?Layer) | 網(wǎng)絡(luò)層負(fù)責(zé)將各個(gè)子網(wǎng)之間的數(shù)據(jù)進(jìn)行路由選擇,分組與重組。本層中數(shù)據(jù)傳輸?shù)膯挝粸閿?shù)據(jù)包(packet)。屬于本層定義的規(guī)范有IP、RIP、OSPF、ICMP、IGMP等。實(shí)際使用中的設(shè)備如路由器屬于本層。 |
傳輸層(Transport?Layer) | 提供可靠的數(shù)據(jù)傳輸服務(wù)(注意OSI的傳輸層與TCP/IP的傳輸層的功能不盡相同),它檢測(cè)路由器丟棄的包,然后產(chǎn)生一個(gè)重傳請(qǐng)求,能夠?qū)y序收到的數(shù)據(jù)包重新排序。 |
會(huì)話層(Session?Layer) | 管理主機(jī)之間會(huì)話過程,包括會(huì)話建立、終止和會(huì)話過程中的管理 |
表示層(Presentation?Layer) | 表示層對(duì)網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)進(jìn)行變換,使得多個(gè)主機(jī)之間傳送的信息能夠互相理解,包括數(shù)據(jù)的壓縮、加密、格式轉(zhuǎn)換等。 |
應(yīng)用層(Application?Layer) | 應(yīng)用層與應(yīng)用程序界面溝通,以達(dá)至展示給用戶的目的。?在此常見的協(xié)定有:?HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等 |
?
TCP/IP模型
?
TCP/IP主要協(xié)議
?
?
數(shù)據(jù)封裝(Encapsulation)圖解
?
?
數(shù)據(jù)分用(Demultiplexing:解包)圖解
?
鏈路層
以太網(wǎng)幀格式
?
以太網(wǎng)幀說明:
? ??鏈路層的數(shù)據(jù)包,稱為以太網(wǎng)幀;?鏈路層不識(shí)別IP地址[因?yàn)镮P地址是邏輯地址],鏈路層識(shí)別物理網(wǎng)卡MAC地址[硬件地址];?需要根據(jù)IP地址找到對(duì)方的MAC地址(ARP地址解析協(xié)議)[MAC?—>?IP地址方向地址解析];
//以太網(wǎng)首部代碼 struct ethernet_hdr {char dest_mac[6];char src_mac[6];short protocol; };ARP地址解析協(xié)議
//ARP首部代碼 struct arp_hdr {unsigned short hwtype; // 固定1unsigned short protype; // 固定0x0800(代表為IP協(xié)議做請(qǐng)求)unsigned char hwaddrlen; // 固定6(即MAC地址長度)unsigned char proaddrlen; // 固定4 (即IP地址長度)unsigned short opcode; // Request - 1, Reply - 0x0002unsigned char sender_mac[6]; // 發(fā)送者M(jìn)ACunsigned char sender_ip[4]; // 發(fā)送者IPunsigned char dest_mac[6]; // 接收者M(jìn)ACunsigned char dest_ip[4]; // 接收者IP };網(wǎng)絡(luò)層
IP數(shù)據(jù)報(bào)
?
各個(gè)字段說明 | |
版本 | IP協(xié)議版本號(hào),?IPv4此字段值為4,?IPv6此字段值為6 |
首部長度 | 取值范圍5(0101)~15(1111),?單位為4字節(jié),?因此首部最長為60字節(jié) |
服務(wù)類型 | 長度為8位。此字段包含3位的優(yōu)先權(quán)(現(xiàn)已忽略),4位的服務(wù)類型子字段(只能有一位置1)和1位的保留位(必須置0)。4位的服務(wù)類型分別為最小延遲(D)、最大吞吐量(T)、最高可靠性(R)、最小費(fèi)用(F),?詳細(xì)解釋見下圖 |
總長度 | 該字段長度為16位,?以字節(jié)為單位,?該字段長度包含IP的頭部和數(shù)據(jù)部分,?IP數(shù)據(jù)報(bào)最大長度為65535字節(jié) |
標(biāo)識(shí) | 16位長度,?唯一標(biāo)識(shí)一個(gè)數(shù)據(jù)報(bào),如果發(fā)送一個(gè)數(shù)據(jù)包,?則該值加1,?如果數(shù)據(jù)報(bào)分段,則每個(gè)分段的標(biāo)識(shí)都一樣,?各個(gè)分片共享一個(gè)標(biāo)識(shí)號(hào) |
標(biāo)志 | 3位標(biāo)志中第一位不使用,?第二位為DF(Don`t?Fragment不分段)位,?如果該位為1,?并且傳輸?shù)臄?shù)據(jù)報(bào)超過最大傳輸單元(MTU),?則該數(shù)據(jù)報(bào)會(huì)被丟棄,?并發(fā)送一個(gè)ICMP差錯(cuò)報(bào)文;?第三位MF(More?Fragment更多分段)位,表示是否有更多的分片,?如果該位為1,?則說明后續(xù)還有分片,?最后一片MF為0 |
片偏移 | 以8個(gè)字節(jié)為單位,指出該分段的第一個(gè)數(shù)據(jù)字在原始數(shù)據(jù)報(bào)中的偏移位置,IP分片后每一個(gè)分組都具有自己的首部,?而且標(biāo)志位相同,?但是片偏移值不同,?通過片偏移值接收端可以重新組裝IP包 |
生存時(shí)間(TTL) | 表示數(shù)據(jù)報(bào)最多可經(jīng)過的路由器點(diǎn)的數(shù)量.?取值0~255,每經(jīng)過一個(gè)路由器,?TTL值減1,為0時(shí)被丟棄,?并發(fā)送ICMP報(bào)文通知源主機(jī),?TTL可以避免數(shù)據(jù)報(bào)在路由器之間不斷循環(huán)(Tranceroute程序的實(shí)現(xiàn)原理) |
協(xié)議類型 | 指明IP層上承載的是哪個(gè)高級(jí)協(xié)議,?在封裝與分用的過程中,?協(xié)議棧知道該交給哪個(gè)層的協(xié)議處理,?如1為ICMP,?2為IGMP,?6為TCP,?17為UDP等. |
頭部校驗(yàn)和 | 保證數(shù)據(jù)報(bào)頭部的數(shù)據(jù)完整性,但校驗(yàn)不包括數(shù)據(jù)部分。這樣做的目的有二:一是所有將數(shù)據(jù)封裝在IP數(shù)據(jù)包中的高層協(xié)議均含有覆蓋整個(gè)數(shù)據(jù)的校驗(yàn)和,因此IP數(shù)據(jù)報(bào)沒有必要再對(duì)其所承載的數(shù)據(jù)部分進(jìn)行校驗(yàn)。二是每經(jīng)過一個(gè)路由器,IP數(shù)據(jù)報(bào)的頭部要發(fā)生改變(如TTL),而數(shù)據(jù)部分不變,這樣只對(duì)發(fā)生改變的頭部進(jìn)行校驗(yàn),顯然不會(huì)浪費(fèi)太多的時(shí)間。為了減少計(jì)算時(shí)間,一般不用CRC校驗(yàn)碼,而是采用更簡單的網(wǎng)際校驗(yàn)和(Internet?Checksum)。 |
選項(xiàng)與填充 | (選項(xiàng)為4字節(jié)整數(shù)倍,否則用0填充) 安全和處理限制 路徑記錄:記錄所經(jīng)歷路由器的IP地址 時(shí)間戳:記錄所經(jīng)歷路由器的IP地址和時(shí)間 寬松源站路由:指定數(shù)據(jù)報(bào)文必須經(jīng)歷的IP地址,可以經(jīng)過沒有指定的IP地址。 嚴(yán)格的源站路由:指定數(shù)據(jù)報(bào)文必須經(jīng)歷的IP地址,不能經(jīng)過沒有指定的IP地址。 |
//IP首部代碼 struct ip_hdr {char ver_hl;char tos;unsigned short len;unsigned short id;unsigned short fragment;char ttl;char protocol;unsigned short hdr_chksum;char src_ip [4];char dest_ip [4]; };
路由過程
?
ICMP協(xié)議
? ??ICMP協(xié)議用于傳遞差錯(cuò)信息、時(shí)間、回顯、網(wǎng)絡(luò)信息等控制數(shù)據(jù)
? ??當(dāng)我們ping?一臺(tái)主機(jī)想看它是否運(yùn)行時(shí),就產(chǎn)生了一條ICMP?信息。遠(yuǎn)程主機(jī)將用它自己的ICMP?信息對(duì)ping?請(qǐng)求作出回應(yīng)。
?
ICMP協(xié)議說明:
? ??ICMP數(shù)據(jù)包本身是IP的一部分,ICMP包含在IP數(shù)據(jù)包的凈荷數(shù)據(jù)中,IP頭中協(xié)議類型為1;?主要用于網(wǎng)關(guān)或者目標(biāo)機(jī)器利用ICMP與源通訊,當(dāng)出現(xiàn)問題時(shí),提供反饋信息;?ICMP數(shù)據(jù)的第一個(gè)字節(jié)代表ICMP報(bào)文的類型,它決定了后續(xù)數(shù)據(jù)的格式
?
//ICMP首部代碼 struct icmp_hdr {char type; // ICMP報(bào)文類型char code; // “子類型”unsigned short icmpchksum; // 校驗(yàn)和 };UDP用戶數(shù)據(jù)報(bào)
?
//UDP首部代碼 struct udp_hdr {unsigned short src_port;unsigned short dest_port;unsigned short len;unsigned short chksum; };TCP報(bào)文段
?
協(xié)議描述 | |
源端口號(hào)和目的端口號(hào) | 源和目的主機(jī)的IP地址加上端口號(hào)構(gòu)成一個(gè)TCP連接 |
序號(hào)和確認(rèn)號(hào) | 序號(hào)為該TCP數(shù)據(jù)包的第一個(gè)字節(jié)在所發(fā)送的數(shù)據(jù)流中的偏移量;確認(rèn)號(hào)為希望接收的下一個(gè)數(shù)據(jù)字的序號(hào); |
數(shù)據(jù)偏移(首部長度) | 以4個(gè)字節(jié)為單位,通常為20個(gè)字節(jié) |
6個(gè)標(biāo)志位: | ? |
????URG | 如果使用了緊急指針,URG置1,緊急指針為當(dāng)前序號(hào)到緊急數(shù)據(jù)位置的偏移量 |
????ACK | 為1表示確認(rèn)號(hào)有效,為0表示該TCP數(shù)據(jù)包不包含確認(rèn)信息 |
????PSH | 表示是帶有PUSH標(biāo)志的數(shù)據(jù),接收到數(shù)據(jù)后不必等緩沖區(qū)滿再發(fā)送 |
????RST | 用于連接復(fù)位,也可用于拒絕非法的數(shù)據(jù)或拒絕連接請(qǐng)求 |
????SYN | 用于建立連接,連接請(qǐng)求時(shí)SYN=1,ACK=0;響應(yīng)連接請(qǐng)求時(shí)SYN=1,ACK=1 |
????FIN | 用于釋放連接,表示發(fā)送方已經(jīng)沒有供發(fā)送的數(shù)據(jù) |
窗口大小 | 表示在確認(rèn)字節(jié)后還可以發(fā)送字節(jié)數(shù),用于流量控制 |
校驗(yàn)和 | 覆蓋了整個(gè)數(shù)據(jù)包,包括對(duì)數(shù)據(jù)包的首部和數(shù)據(jù) |
選項(xiàng) | 常見的選項(xiàng)是MSS(Maximum?Segment?Size,?最大報(bào)文長度) |
?
連接建立三次握手
?
連接終止四次揮手
?
TCP如何保證可靠性
? ??應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊,稱為TCP報(bào)文段傳遞給IP層。
? ??當(dāng)TCP發(fā)出一個(gè)段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn),將重發(fā)這個(gè)報(bào)文段。
? ??當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)。這個(gè)確認(rèn)不是立即發(fā)送,通常將推遲幾分之一秒。
? ??TCP將保持它首部和數(shù)據(jù)的校驗(yàn)和。這是一個(gè)端到端的校驗(yàn)和,目的是檢測(cè)數(shù)據(jù)在傳輸過程中的任何變化。如果收到段的校驗(yàn)和有差錯(cuò),TCP將丟棄這個(gè)報(bào)文段并且不確認(rèn)(導(dǎo)致對(duì)方超時(shí)重傳);
? ??TCP承載于IP數(shù)據(jù)報(bào)來傳輸,而IP數(shù)據(jù)報(bào)的到達(dá)可能會(huì)失序,因此TCP報(bào)文段的到達(dá)也可能會(huì)失序。TCP將對(duì)收到的數(shù)據(jù)進(jìn)行重新排序。
? ??IP數(shù)據(jù)報(bào)會(huì)發(fā)生重復(fù),TCP的接收端必須丟棄重復(fù)的數(shù)據(jù)。
? ??TCP還能提供流量控制。TCP連接的每一方都有一定大小的緩沖空間。
端口分類 | |
眾所周知端口:從0到1023 | 這些端口由IANA分配和控制它們緊密綁定于一些服務(wù)。通常這些端口的通訊明確表明了某種服務(wù)的協(xié)議。例如:21為ftp服務(wù)端口 |
注冊(cè)端口:從1024到49151 | 這些端口不受IANA控制,但由IANA登記并提供使用情況清單。它們松散地綁定于一些服務(wù)。也就是說有許多服務(wù)綁定于這些端口,這些端口同樣可以用于許多其它目的。例如:1433?Microsoft?SQL服務(wù)端口 |
臨時(shí)端口:從49152到65535 | IANA不管這些端口。實(shí)際上,機(jī)器通常從1024起分配動(dòng)態(tài)端口(例外:SUN的RPC端口從32768開始) |
?
綜合:數(shù)據(jù)在網(wǎng)絡(luò)中傳輸過程
?
? ??步驟a:應(yīng)用程序ping會(huì)判斷發(fā)送的是主機(jī)名還是IP地址,調(diào)用函數(shù)gethostbyname()解析主機(jī)機(jī)B,將主機(jī)名轉(zhuǎn)換成一個(gè)32位的IP地址。這個(gè)過程叫做DNS域名解析.
? ??步驟b:ping程序向目的IP地址發(fā)送一個(gè)ICMP的ECHO包
? ??步驟c:將目標(biāo)主機(jī)的IP地址轉(zhuǎn)換為48位硬件地址,在局域網(wǎng)內(nèi)發(fā)送ARP請(qǐng)求廣播,查找主機(jī)B的硬件地址。
? ??步驟d:主機(jī)B的ARP協(xié)議層接收到主機(jī)A的ARP請(qǐng)求后,將本機(jī)的硬件地址填充到應(yīng)答包,發(fā)送ARP應(yīng)答到主機(jī)A。
? ??步驟e:發(fā)送ICMP數(shù)據(jù)包到主機(jī)B
? ??步驟f:主機(jī)B接收到主機(jī)A的ICMP包,發(fā)送響應(yīng)包。
? ??步驟g:主機(jī)A接收到主機(jī)B的ICMP包響應(yīng)包。
其他更詳細(xì)的關(guān)于TCP/IP計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)請(qǐng)參考博客:
http://blog.csdn.net/zjf280441589/article/category/1854365
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的Socket编程实践(1) --TCP/IP简述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Office Communication
- 下一篇: 正则表达式入门教程-连载(4)-点符号(