Linux网络编程 学习笔记(三)组包拆包流程、网络开发流程、TCP和UDP的特点、字节序,地址转换(先简单了解)

组包拆包流程

在这里插入图片描述
udp传输
链路层封包:
在这里插入图片描述
2+1+1+1+3 = 8一般用不到。
一般组 以太网封装的,目的地址(6字节),源地址(6字节)类型(2字节)6+6+2 = 14
网络层封包:
在这里插入图片描述
版本号:(4位)
首部长度:(4位 ,注意此处1代表4字节,即单位是32位,20字节,0110就可以)。
服务类型: 一般不适用,取值为0。
总长度:指的是首部加上 数据总长度,单位为字节。
标识:ip在存储器中维持一个计数器,每产生一个数据报,计数器加1,将值复制给次位置。
标志(flag):目前只有两位有意义。标志最低位为MF ,MF = 1代表后面还有分片的数据报。MF = 0代表这是若干数据报的最后一个。标记字段中的一位记为DF,意思是“不能分片”,只有当DF = 0时候,才允许分片。
TTL : 经过路由器的最大数量。每次经过一个路由器就减去 1,当TTL变为 0 ,就不转发了,认为是垃圾,就丢掉。128或者64 - TTL就是几个需要经过几个路由器。

协议: 指出此数据报携带的数据使用何种协议,以便使目的主机的IP层知道应该将数据怎么处理。

TCP
窗口尺寸:告诉之前通信方,己方还有多大缓冲区。

网络开发流程

B/S browser/server 浏览器与服务器模型
不能用与对性能要求高的程序。
安全,不容易偷数据。
移植性高,不依赖平台
C/S client/server 客户端与服务器模型
不是特别安全,移植性低一些。开发周期较长。
可运行对性能要求较高的程序

C/S
TCP(传输控制协议)面向连接的,出错重传。并且每个报文都会有序列号和确认序列号。每次收到数据就会给出回应ACK。
UDP (用户数据报协议)没有客户端和服务器一说。不能保证接收顺序相同。一般多几个路由器就会丢包。在一个局域网不会丢包。不安全,可以应用层添加协议,让他出错重传。

编程准备 字节序,地址转换

字节序:多字节数据的存储顺序
举例:
unsigned short num = 0x0102
占用2个字节
小端 低位存低位 0010 0001
大端 高位存低位 0001 0010

分类
小端格式:将低位字节数据 存储在低地址。
大端格式:将高位字节数据存储在低地址。
注意:
LSB:低地址
MSB:高地址

转网络字节序 网络上传输的都是大端,发则 主机字节序转网络字节序,收则 网络字节序转主机字节序。
测试主机是大端还是小端(主机一般是小端,服务器一般是大端):
在这里插入图片描述
将 32位主机字节序 转 网络字节序函数
在这里插入图片描述

输出为4030201
201

网络字节序主机字节序
uint16_t ntohs(uint16_t netint16);
uint16_t: unsigned short int
netint16:待转换的16位网络字节序数据

将点分十进制数串转换成32位无符号整数
int inet_pton(int family,const char *strptr, void *addrptr);

#include <stdio.h>
#include <arpa/inet.h>
int main(int argc,char *argv[])
{
	char ip_str[] = "10.0.13.100";
	unsigned int ip_uint = 0;
	unsigned char * ip_p =NULL;//可以用char吗?
	
	inet_pton(AF_INET,ip_str,&ip_uint);
	printf("ip_uint = %d\n",ip_uint);
	
	ip_p = (unsigned char *) &ip_uint;
	printf("ip_uint = %d.%d.%d.%d\n",*ip_p,*(ip_p+1),*(ip_p+2),*(ip_p+3));
	
	return 0;
}

2.1.6.2inet_ntop函数
整型数据转字符串格式ip地址
const char *inet_ntop(int family, const void *addrptr,
char *strptr, size_t len);

#include<stdio.h>
#include<arpa/inet.h>
int main()
{
	unsigned char ip[]={10,0,13,252};
	char ip_str[16];
	inet_ntop(AF_INET,(unsigned int *)ip,ip_str,16);
	printf("ip_str = %s\n",ip_str);
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值