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

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状态变迁图:

http://blog.csdn.net/sprintfwater/article/details/12286409

Socket:

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

socket编程实例

UNIX socket API详解http://blog.csdn.net/hguisu/article/details/7445768

 

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

对于一个多字节的数据,如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)把网络地址转换成点分十进制字符串形式。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值