汇总一些网络相关的基础概念
来源:互联网 发布:游戏多开软件 编辑:程序博客网 时间:2024/05/17 23:51
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是低位,它们在内存中的存储可能有两种情况,即主机字节序:
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;
}
- 汇总一些网络相关的基础概念
- 多线程相关的一些基础概念:同步、异步、并发、并行
- 图解 HTTP:Web开发相关的一些核心基础概念
- 网络的基础概念:
- 网络基础概念以相关技术
- 一些硬件相关的概念
- OLAP的一些相关概念
- linux网络编程的一些基础知识--基础API相关
- 模块的相关基础概念
- 音频相关的基础概念
- 网络的一些概念--简述
- 一些计算机硬件的基础概念
- 一些基础的c++概念
- MapXtreme的一些基础概念
- MapXtreme的一些基础概念
- 一些基础概念的总结。。。。
- 一些I2S的基础概念
- 状态机的一些基础概念
- 《Java实战开发经典》第四章4.7
- 解决linux环境机器 系统时间不对
- wsdl 生成客户端
- 黑马程序员--java技术blog---第四篇:IO流(3)
- 改天记得把自己那个代码中的改成这个boost::lexical_cast
- 汇总一些网络相关的基础概念
- 《Java实战开发经典》第四章4.8
- hdu 1709 求天平不能称重的重量 动态规划
- vector向量容器
- Unicode 和ANSI字符串转换(引用自Windows内核编程(第五版 ))
- 【简单认识】机器学习常见分类算法——朴素贝叶斯
- os模块
- 以后KMP就按照这个方式写了。看了kuangbin的写法
- 深入剖析百度dsp系统底层以及框架