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