子网划分
IP地址分类:ABCDE,1、128、192、224、240开头。
分别是:主机公网、国际公司政府、小公司校园网科研单位、组播、保留。
四个八位二进制数组成。
私网:ABC分别是0、172.16、192.168。
127.0.0.1本地环网,localhost测试用。
子网掩码
网络掩码,地址掩码,子网络遮罩,就是说把自网络折起来了,不让外界窥探。
一般前面都是1,1的个数就是子网数。
某主机对外地址:ip地址按位与子网掩码,就是主机对外地址。
主机号和对外主机号,确定子网。
ABC的默认子网掩码,分别是8、16、24。
子网掩码隐藏主机号。
广播是正常网络号加上主机部分全是1的ip地址。
有限广播:32位全是1,用于本网广播。
如果发送给255.255.255.255那么全部主机都可以收到。
有限广播必须是自己也得在网络内部。但是直接广播不用,甚至可以给其他网络里发广播。
主机号是非默认子网掩码。非默认一定是默认的多出来的。
以太网帧结构
包括:起始指针、MAC头部、IP头部、TCP头部、数据、FCS。
其中IP、TCP、数据合体的最大长度叫做:MTU,数据的最大长度叫做MSS。
MTU=1500。
以太网帧结构:目标mac(6)、源mac(6)、类型(2)、数据(16-1500)、帧校验(4)
数据(46-1500)MTU=IP头(20)+TCP头(20+TCP选项)+用户数据MSS
以太网帧的大小范围:64-1518,MSS大小:1500-20ip头-20tcp头=1460
IP协议格式
ip报文=ip数据报,首部+数据部分。
版本号4b。
首部长度4b,一般是固定部分+可变部分。
区分服务8b,总长度,首部+数据长度。
标识,16b,计数器,标识作用是分片。
标志4b、片位移12b,与标识一块使用,用来分割数据,同时保证了数据的完整。按照偏移重新组回数据。
生存时间8b,到了时间之后,生存时间消失,丢弃包。
协议8b,tcp还是udp
首部校验和16b,看数据是否被篡改。
源地址32b、目的地址32b。
剩余是数据部分。
sock阻塞
阻塞就是停了,每过一段时间,看看完没完成。
将阻塞函数设置成阻塞函数。
例如recvfrom就是阻塞函数。
如果阻塞函数,就可以放入线程中。
ioctlsocket函数将sock变成非阻塞。
u_long iMode=1;
err=ioctlsocket(sock,FIONBIO,&iMode);
if(err==SOCKET_ERROR)cout<<"iocklsocket failed with error"<<err<<endl;
缓冲区
系统会给运行的进程分配空间,创建一个套接字,系统就会分配两块缓冲区,分别是发送缓冲区和接收缓冲区,并不是自己定义的那种。
getsockopt获取缓冲区大小。
阻塞模式下的sendto:如果缓冲区没有足够的空间,就等待足够大后,再把数据放入发送缓冲区。
非阻塞模式下的sendto:只要有数据要发送,就放入缓冲区,能放多少就放多少,放完之后立即返回,返回的是实际放入的数据大小。
UDP特点
UDP数据报的特点:
- UDP数据报,只要数据放入发送缓冲区,就直接发送出去,然后从缓冲区中删除——不可靠。
- 数据不可拆分,接到多少,剩下的就丢弃了。
UDP特点:
- 面向非连接,可以是1对1,也可以是1对多(广播和组播)
- 通讯方式:数据报文,数据包不可炒粉
- 传输效率高
- 会丢包,没有校验,可能出现乱序。