您的位置:首页 > 理论基础 > 计算机网络

汇总一些网络相关的基础概念

2015-08-12 15:55 519 查看
TCP/IP参考模型:

四层,自下而上分别是:主机到网络层->网络互联层->传输层->应用层。

对应OSI七层模型:(物理层、数据链路层)->网络层->传输层->(会话层->表示层->应用层)

每一层的数据单元:(比特->帧)->包packet带IP头->段segment带TCP/UDP头->(数据、消息、报文message)

TCP/IP协议格式:

报文封装格式:Ethernet帧头 | IP头部 | TCP头部 | 上层数据 | FCS

IP头部格式RFC791:20个字节的IP头封装了IP地址

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Bit

版本 | 报头长度 | 服务类型 | 总长度 |

标识 | flags | 片偏移量 |

生存期 | 协议 | 头部校验和 |

源地址 |

目标地址 |

可选项 |

数据 |

TCP头部格式RFC793、1323:20个字节的TCP头封装了端口号

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Bit

源端口号 | 目标端口 |

顺序号 seq |

确认号 ack |

头部长度 | 保留 | C | E |U | A | P | R| S | F| 窗口大小 |

校验和 | Urgent Pointer |

TCP Options (变长,可选) |

TCP三次握手和四次挥手:

三次握手,把各自的SYN序号告知对方

client server

seq=X, SYN=1 ---------------------------------------->

<------------------------------seq=Y, ack=X+1, SYN=1

seq=Z, ack=Y+1-------------------------------------->

连接断开。。

SYN攻击:客户端在短时间内伪造大量不存在的IP地址,想服务器不断发送syn包,服务器回复确认包并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢。一个典型的DDOS工具。检测netstat -n -p TCP | grep SYN_RECV.

四次挥手,全双工的,双方都需要fin+ack所以是4次

主动方 被动方

seq=X, ack=Z, FIN=1------------------------------------>

<-------------------------------------------seq=Z,
ack=X+1

<-------------------------------------------seq=Y, ack=X,
FIN=1

seq=X+1, ack=Y+1--------------------------------------->

详见《TCP那些事儿(上)》http://coolshell.cn/articles/11564.html



TCP状态变迁图:

/article/7813898.html



Socket:

TCP/IP、HTTP都是协议规范,而socket是对协议的封装和应用,它本身并不是一个协议,而是编程接口API,通过socket我们才能使用TCP/IP协议栈,socket提供了一个针对TCP或者UDP编程的接口。socket位于内核TCP/IP协议栈之上。



socket编程实例



UNIX socket API详解/article/7644611.html

主机字节序、网络字节序、大端、小端:

对于一个多字节的数据,如0x1234,0x12是高位,0x34是低位,它们在内存中的存储可能有两种情况,即主机字节序:

地址 0x1000 0x1001
数值 0x12 0x34
也就是数据的高位存储在内存的低地址一端,就是大端模式。

地址 0x1000 0x1001
数值 0x34 0x12
也就是数据的低位存储在内存的低地址一端,就是小端模式。

因为字节序的差别,所以在网络传输的时候定义了所有字节顺序相关的数据都使用大端模式,BSD代码中定义了四个宏来处理:
#define ntohs(n) 网络字节序到主机字节序,n代表net,h代表host,s代表short
#define htons(n) 主机字节序到网络字节序
#define ntohl(n) 网络字节序到主机字节序,l代表long
#define htonl(n) 主机字节序到网络字节序
其中一个宏的实现:
#define sw16(x) \
((short) ( \
(((short) (x) & (short)0x00ffU) << 8) | \
(((short) (x) & (short)0xff00U) >> 8))

测试自己的机器是大端字节序还是小端字节序:
#include <stdio.h>

int isLittleEndian()

{

//数据从高位到低位

unsigned int usData = 0x12345678;

//截断内存的高位,保留低位

unsigned char *pucData = (unsigned char *) &usData;

//如果低位内存存储低位数据,则是小端模式

if (*pucData == 0x78)

return 1;

else

return 0;

}

int main(void)

{

if (isLittleEndian())

printf("Little endian!\n");

else

printf("Big endian!\n");

return 0;

}

另外inet_ntoa(struct sin_addr)把网络地址转换成点分十进制字符串形式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: