IP与子网掩码的关系和作用
子网掩码是一种用来指明IP地址哪些位标识的是主机所在的子网以及哪些位标识的是主机的位掩码。
子网掩码不能单独存在,它必须结合IP地址一起使用,其作用是将某个IP地址划分成网络地址和主机地址两部分。
子网掩码长度是32位,左边是网络位,用二进制“1”表示,1 的数目等于网络位的长度;
右边是主机位,用0表示,0数目等于主机位的长度。
A类IP段:1.0.0.1—126.255.255.254,子网掩码为:255.0.0.0
B类IP段:128.1.0.1—191.255.255.254,子网掩码为:255.255.0.0
C类IP段:192.0.1.1—223.255.255.254,子网掩码为:255.255.255.0
网络数据包的封装过程
应用层数据在经过协议栈发到网络上时,每层协议都要加上一个数据首部,叫做数据的封装。
上图为从应用层到传输层,再到网络层到链路层的数据封装过程。
当数据封装成帧后,发到传输介质上,到达目的主机上每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
TCP协议封装格式
顺序号字段:用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节
确认号字段:只有ACK标志为1时,确认号字段才有效,它包含目标端所期望收到源端的下一个数据字节。
4位首部长度:表示TCP协议头的长度,以4字节为单位, TCP协议头最长可以是4*15=60字节,如果没有选项字段,TCP协议头最短20字节。URG、ACK、PSH、RST、SYN、FIN是六个控制位。
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文段交给应用层。
RST:重建连接。
SYN:发起一个连接。
FIN:释放一个连接。
窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。
TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。
紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。
UDP协议封装格式
源/目标端口号:各占16比特。作用与TCP数据段中的端口号字段相同,用来标识源端和目标端的应用进程。
Udp长度:占16比特。标明UDP头部和UDP数据的总长度字节。
Udp校验和:用来对UDP头部和UDP数据进行校验。和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的。
IP数据报格式
IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。
对于IPv4,4位版本字段是4。
4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。
8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。
总长度是整个数据报(包括IP首部和IP层payload)的字节数。
每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。
3位标志和13位片偏移用于分片。
TTL(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。
协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。
然后是校验和,只校验IP首部,数据的校验由更高层协议负责。
TCP和UDP各自对应的应用程序
TCP协议是基于连接的可靠协议,有流量控制和差错控制,也正因为有可靠性的保证和控制手段,所以传输效率比UDP低。
UDP协议是基于无连接的不可靠协议,没有控制手段,仅仅是将数据发送给对方,因此效率比TCP要高。
TCP一般用于对数据准确性要求高的文件传输(FTP HTTP),发送或接收邮件(POP IMAP SMTP),远程登录(TELNET SSH),网络数据库,分布式高精度计算系统的数据传输等等。
UDP一般用于对数据准确性和丢包要求比较低,但速度必须快的场合,如即时通信(QQ聊天),在线视频(RTSP),网络语音电话(VoIP),或者用于服务系统内部之间的数据传输,因为数据可能比较多,内部系统局域网内的丢包错包率又很低等情况。