Socket编程 - 网络基础知识
生活随笔
收集整理的這篇文章主要介紹了
Socket编程 - 网络基础知识
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
API編程部分:http://www.cnblogs.com/Jimmy1988/p/7895213.html
1. 協(xié)議簡(jiǎn)介
此處,我們主要介紹Linux編程常用的三種協(xié)議(TCP/UDP/IP), 關(guān)于三種協(xié)議的定義,可參見各自的頭文件:
- /usr/include/linux/tcp.h
- /usr/include/linux/udp.h
- /usr/include/linux/ip.h
①. TCP
/** Come from /usr/include/linux/tcp*/ struct tcphdr {__be16 source;__be16 dest;__be32 seq;__be32 ack_seq; #if defined(__LITTLE_ENDIAN_BITFIELD)__u16 res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1; #elif defined(__BIG_ENDIAN_BITFIELD)__u16 doff:4,res1:4,cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1; #else #error "Adjust your <asm/byteorder.h> defines" #endif__be16 window;__sum16 check;__be16 urg_ptr; };源端口 | 16 | 源端口和IP地址的作用是標(biāo)識(shí)報(bào)文的返回地址 |
目的端口 | 16 | 端口指明接收方計(jì)算機(jī)上的應(yīng)用程序接口 常用端口: ?- ftp/tftp:?; 20、21/69 ?- SSH: ?22 ?- telent:?23 ?- smtp: ?25 ?- http/https: ?80/443 ?- pop3/snmp: ?110/163 (詳細(xì)信息參見:http://cert.sjtu.edu.cn/doc/linux/ch-ports.html) 或者參見Linux的文件 /usr/services |
序號(hào) | 32 | 本報(bào)文段發(fā)送的數(shù)據(jù)組的第一個(gè)字節(jié)的序號(hào) |
確認(rèn)序號(hào) | 32 | 下一個(gè)期待收到的字節(jié)序號(hào) |
數(shù)據(jù)偏移/首部長(zhǎng)度 | 4 | TCP報(bào)頭的長(zhǎng)度 報(bào)頭長(zhǎng)度=首部長(zhǎng)度*32bit |
保留 | 4 | 為將來(lái)定義新的用途保留,現(xiàn)在一般置0 |
URG | 1 | 緊急指針標(biāo)志 - 為1時(shí)表示緊急指針有效 - 為0則忽略緊急指針 |
ACK | 1 | 確認(rèn)序號(hào)標(biāo)志 - 為1時(shí)表示確認(rèn)號(hào)有效 - 為0表示忽略確認(rèn)號(hào)字段 |
PSH | 1 | push標(biāo)志 - 1:指示接收方在接收到該報(bào)文段以后, ??應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用程序,而不是在緩沖區(qū)排隊(duì) |
RST | 1 | 重置連接標(biāo)志 用于重置由于主機(jī)崩潰或其他原因而出現(xiàn)錯(cuò)誤的連接。 或者用于拒絕非法的報(bào)文段和拒絕連接請(qǐng)求 |
SYN | 1 | 同步序號(hào) 用于建立連接過(guò)程,在連接請(qǐng)求中, - SYN=1和ACK=0表示該數(shù)據(jù)段沒(méi)有使用捎帶的確認(rèn)域; - SYN=1和ACK=1,而連接應(yīng)答捎帶一個(gè)確認(rèn) |
FIN | 1 | finish標(biāo)志,用于釋放連接 - 1: 表示發(fā)送方已經(jīng)沒(méi)有數(shù)據(jù)發(fā)送了,即關(guān)閉本方數(shù)據(jù)流 |
窗口 | 16 | 滑動(dòng)窗口大小 用來(lái)告知發(fā)送端接受端的緩存大小, 以此控制發(fā)送端發(fā)送數(shù)據(jù)的速率, 從而達(dá)到流量控制 |
校驗(yàn)和 | 16 | 奇偶校驗(yàn) 此校驗(yàn)和是對(duì)整個(gè)的 TCP 報(bào)文段,包括 TCP 頭部和 TCP 數(shù)據(jù),以 16 位字進(jìn)行計(jì)算所得; 由發(fā)送端計(jì)算和存儲(chǔ),并由接收端進(jìn)行驗(yàn)證。 |
緊急指針 | 16 | 只有當(dāng) URG 標(biāo)志置 1 時(shí)緊急指針才有效 緊急指針是一個(gè)正的偏移量,和順序號(hào)字段中的值相加 表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)。 |
選項(xiàng)和填充 | 32 | 表示本端所能接受的最大報(bào)文段的長(zhǎng)度 |
②. UDP
/** Come from /usr/include/linux/udp.h*/ struct udphdr {__be16 source;__be16 dest;__be16 len;__sum16 check; };源端口 | 16 | 源端口號(hào)。在需要對(duì)方回信時(shí)選用。不需要時(shí)可用全0 |
目的端口 | 16 | 目的端口號(hào)。這在終點(diǎn)交付報(bào)文時(shí)必須要使用到 |
長(zhǎng)度 | 16 | UDP用戶數(shù)據(jù)報(bào)的長(zhǎng)度,其最小值是8(僅有首部) |
校驗(yàn)和 | 16 | 檢測(cè)UDP用戶數(shù)據(jù)報(bào)在傳輸中是否有錯(cuò)。有錯(cuò)就丟棄 |
③. IP
/* * Comes from /usr/include/linux/ip.h*/struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD)__u8 ihl:4,version:4; #elif defined (__BIG_ENDIAN_BITFIELD)__u8 version:4,ihl:4; #else #error "Please fix <asm/byteorder.h>" #endif__u8 tos;__be16 tot_len;__be16 id;__be16 frag_off;__u8 ttl;__u8 protocol;__sum16 check;__be32 saddr;__be32 daddr;/*The options start here. */ };version | 4 | IP協(xié)議的版本 |
IHL (Internet Header Length) | 4 | IP報(bào)頭的長(zhǎng)度 固定部分的長(zhǎng)度(20字節(jié))和可變部分的長(zhǎng)度之和 **Length=IHL*32bit** |
TOS (Type Of Service) | 8 | IP數(shù)據(jù)包的服務(wù)類型 |
總長(zhǎng)度 | 16 | IP報(bào)文的總長(zhǎng)度 報(bào)頭的長(zhǎng)度和數(shù)據(jù)部分的長(zhǎng)度之和 |
標(biāo)識(shí) | 16 | 唯一的標(biāo)識(shí)主機(jī)發(fā)送的每一分?jǐn)?shù)據(jù)報(bào) 通常每發(fā)送一個(gè)報(bào)文,它的值加一。 當(dāng)IP報(bào)文長(zhǎng)度超過(guò)傳輸網(wǎng)絡(luò)的MTU(最大傳輸單元)時(shí)必須分片, 這個(gè)標(biāo)識(shí)字段的值被復(fù)制到所有數(shù)據(jù)分片的標(biāo)識(shí)字段中, 使得這些分片在達(dá)到最終目的地時(shí) 可以依照標(biāo)識(shí)字段的內(nèi)容重新組成原先的數(shù)據(jù)。 |
標(biāo)志 | 3 | R、DF、MF三位 目前只有后兩位有效 - DF位:為1表示不分片,為0表示分片; - MF:為1表示“更多的片”,為0表示這是最后一片 |
片位移 | 13 | 本分片在原先數(shù)據(jù)報(bào)文中相對(duì)首位的偏移位 (需要再乘以8) |
TTL (Time To Live) | 8 | IP報(bào)文所允許通過(guò)的路由器的最大數(shù)量 每經(jīng)過(guò)一個(gè)路由器,TTL減1; 當(dāng)為0時(shí),路由器將該數(shù)據(jù)報(bào)丟棄 |
協(xié)議 | 8 | 指出IP報(bào)文攜帶的數(shù)據(jù)使用的是那種協(xié)議, 以便目的主機(jī)的IP層能知道要將數(shù)據(jù)報(bào)上交到哪個(gè)進(jìn)程。 - TCP: 6 - UDP: 17 - ICMP: 1 - IGMP: 2 |
首部校驗(yàn)和 | 16 | 計(jì)算IP頭部的校驗(yàn)和, 檢查IP報(bào)頭的完整性 |
源IP地址 | 32 | 標(biāo)識(shí)IP數(shù)據(jù)報(bào)的源端設(shè)備 |
目的IP地址 | 32 | 標(biāo)識(shí)IP數(shù)據(jù)報(bào)的目的地址。 |
2. IPv4相關(guān)操作
/* Internet address. */ typedef uint32_t in_addr_t; struct in_addr {in_addr_t s_addr; };①. IPv4地址轉(zhuǎn)換
in_addr_t inet_addr( const char *cp) | cp:十進(jìn)制字符串 | 成功:0 失敗:非0 | 將點(diǎn)分十進(jìn)制字符串 轉(zhuǎn)換為32位網(wǎng)絡(luò)字節(jié)(大端) |
in_addr_t inet_network( const char *cp) | cp:十進(jìn)制字符串 | 成功:32bit 地址 失敗:非0 | 將點(diǎn)分十進(jìn)制字符串 轉(zhuǎn)換為32位主機(jī)字節(jié)順序的IP地址 |
char *inet_ntoa( struct in_addr in) | in:32bit網(wǎng)絡(luò)IP | 點(diǎn)分十進(jìn)制字符串 | 將32bit的網(wǎng)絡(luò)順序字節(jié) 轉(zhuǎn)化為點(diǎn)分十進(jìn)制字符串方式 |
int inet_aton( const char *cp, struct in_addr *inp | 1.cp: 欲轉(zhuǎn)化的點(diǎn)分十進(jìn)制IP的首地址 2.inp:轉(zhuǎn)化結(jié)果的地址空間首地址 | 成功:0 失敗:非0 | 點(diǎn)分十進(jìn)制字符串 轉(zhuǎn)化為32bit的網(wǎng)絡(luò)順序字節(jié)順序 |
②. 獲取ID
in_addr_t inet_lnaof( struct in_addr in) | in:ip地址 | 返回標(biāo)準(zhǔn)主機(jī)ID | 獲取標(biāo)準(zhǔn)主機(jī)ID |
in_addr_t inet_netof( struct in_addr in) | in:ip地址 | 返回標(biāo)準(zhǔn)主機(jī)ID | 獲取標(biāo)準(zhǔn)網(wǎng)絡(luò)ID |
struct in_addr inet_makeaddr( int net, int host) | 1.net:網(wǎng)絡(luò)ID 2.host:主機(jī)ID | 返回IP | 將主機(jī)ID和網(wǎng)絡(luò)ID合成標(biāo)準(zhǔn)IP |
3. 大端小端
- 大端:Big-Endian
即內(nèi)存高地址存放數(shù)據(jù)的低字節(jié):如0x1234,存放在0x4000~0x4001,則0x4000存0x12,0x4001存0x34
網(wǎng)絡(luò)字節(jié)順序統(tǒng)一采用大端 - 小端:Little-Endian
與大端相反,即高地址存放高字節(jié)
x86系列處理器為小端模式
①.程序判斷大小端
#include <stdio.h>int main() {union end_un{unsigned short int word;char ch;}endian;endian.word = 0x1234;if(endian.ch == 0x12){printf("This is Big-Endian!\n");}else if(endian.ch == 0x34){printf("This is Little-Endian!\n");}return 0; }②. 字節(jié)順序轉(zhuǎn)化函數(shù)
頭文件:#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong) | long host to net |
uint16_t htons(uint16_t hostshort) | short host to net |
uint32_t ntohl(uint32_t netlong ) | long net to host |
uint16_t ntohs(uint16_t netshort ) | short net to host |
轉(zhuǎn)載于:https://www.cnblogs.com/Jimmy1988/p/7839940.html
總結(jié)
以上是生活随笔為你收集整理的Socket编程 - 网络基础知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

- 上一篇: Deconvolution与Upsamp
- 下一篇: NET全控件