日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Socket编程 - 网络基础知识

發(fā)布時(shí)間:2025/7/25 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Socket编程 - 网络基础知识 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

API編程部分:http://www.cnblogs.com/Jimmy1988/p/7895213.html

1. 協(xié)議簡介

此處,我們主要介紹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; }; UnitbitsFunction
源端口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ù)偏移/首部長度4TCP報(bào)頭的長度
報(bào)頭長度=首部長度*32bit
保留4為將來定義新的用途保留,現(xiàn)在一般置0
URG1緊急指針標(biāo)志
- 為1時(shí)表示緊急指針有效
- 為0則忽略緊急指針
ACK1確認(rèn)序號(hào)標(biāo)志
- 為1時(shí)表示確認(rèn)號(hào)有效
- 為0表示忽略確認(rèn)號(hào)字段
PSH1push標(biāo)志
- 1:指示接收方在接收到該報(bào)文段以后,
??應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用程序,而不是在緩沖區(qū)排隊(duì)
RST1重置連接標(biāo)志
用于重置由于主機(jī)崩潰或其他原因而出現(xiàn)錯(cuò)誤的連接。
或者用于拒絕非法的報(bào)文段和拒絕連接請(qǐng)求
SYN1同步序號(hào)
用于建立連接過程,在連接請(qǐng)求中,
- SYN=1和ACK=0表示該數(shù)據(jù)段沒有使用捎帶的確認(rèn)域;
- SYN=1和ACK=1,而連接應(yīng)答捎帶一個(gè)確認(rèn)
FIN1finish標(biāo)志,用于釋放連接
- 1: 表示發(fā)送方已經(jīng)沒有數(shù)據(jù)發(fā)送了,即關(guān)閉本方數(shù)據(jù)流
窗口16滑動(dòng)窗口大小
用來告知發(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)文段的長度

②. UDP

/** Come from /usr/include/linux/udp.h*/ struct udphdr {__be16 source;__be16 dest;__be16 len;__sum16 check; }; UnitbitsFunction
源端口16源端口號(hào)。在需要對(duì)方回信時(shí)選用。不需要時(shí)可用全0
目的端口16目的端口號(hào)。這在終點(diǎn)交付報(bào)文時(shí)必須要使用到
長度16UDP用戶數(shù)據(jù)報(bào)的長度,其最小值是8(僅有首部)
校驗(yàn)和16檢測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. */ }; UnitbitsFunction
version4IP協(xié)議的版本
IHL
(Internet Header Length)
4IP報(bào)頭的長度
固定部分的長度(20字節(jié))和可變部分的長度之和
**Length=IHL*32bit**
TOS
(Type Of Service)
8IP數(shù)據(jù)包的服務(wù)類型
總長度16IP報(bào)文的總長度
報(bào)頭的長度和數(shù)據(jù)部分的長度之和
標(biāo)識(shí)16唯一的標(biāo)識(shí)主機(jī)發(fā)送的每一分?jǐn)?shù)據(jù)報(bào)
通常每發(fā)送一個(gè)報(bào)文,它的值加一。
當(dāng)IP報(bào)文長度超過傳輸網(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)志3R、DF、MF三位
目前只有后兩位有效
- DF位:為1表示不分片,為0表示分片;
- MF:為1表示“更多的片”,為0表示這是最后一片
片位移13本分片在原先數(shù)據(jù)報(bào)文中相對(duì)首位的偏移位
(需要再乘以8)
TTL
(Time To Live)
8IP報(bào)文所允許通過的路由器的最大數(shù)量
每經(jīng)過一個(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)換

函數(shù)參數(shù)返回值描述
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

函數(shù)參數(shù)返回值描述
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>

函數(shù)數(shù)功能
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编程 - 网络基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。