网络分层模型及作用

1) 物理层
定义了网络的物理结构、传输的电磁标准、Bit流的编码及网络的时间原则。
2)数据链路层
在两个主机上建立数据链路连接,向物理层传输数据信号,并对信号进行处理使之无差错
并合理地传输。
3) 网络层
主要负责路由、选择合适的路径和进行阻塞控制等功能。
4) 传输层
向用户提供可靠的端到端服务,它屏蔽了下层的数据通信细节,让用户及应用程序不需要
考虑实际的通信方法。
5) 会话层
主要负责两个会话进程之间的通信,即两个会话层实体之间的信息交换和管理数的交换。
6) 表示层
处理通信信号的表示方法,进行不同格式之间的翻译,并负责数据的加密解密,数据的
压缩与恢复。
7) 应用层
保持应用程序之间建立连接所需要的数据记录,为用户服务。

一、数据封装:
以太网帧:以太网头部、IP头部、TCP头部、HTTP头部、以太网尾部
IP数据报:IP头部、TCP头部、HTTP头部、数据
TCP段:TCP头部、HTTP头部、数据
HTTP头部、数据
数据

IP头部——数据总共46-1500字节

以太网:以太网驱动-IP-TCP-应用程序
二、IP地址:
1、使用IP协议通讯的主机都有IP地址,如:192.168.2.10
2、在计算机中,IPv4地址用一个32位无符号整数表示

一、端口号
TCP/UDP协议使用16位整数存储端口号,所以每个主机拥有 65,535 个端口
一些端口被IANA分配给指定应用
21: FTP
23: Telnet
80: HTTP
RFC 1700 (大约有2000个保留端口)

二、TCP和UDP的区别
1、TCP提供一种面向连接的、可靠的字节流服务
2、UDP是无连接的、不可靠的数据协议报

Socket套接字
1)linux中的网络编程通过socket接口实现。Socket既是一种特殊的IO,一个完整的Socket都有一个相关描述
{协议,本地地址,本地端口,远程地址,远程端口};每一个Socket 有一个本地的唯一Socket号,由操作系统分配。


函数原型

include<sys/socket.h>

int socket(int domain,int type,int protocol)
返回:成功返回描述符,出错返回-1

参数:
domain
AF_INET IPv4因特网域
AF_INET6 IPv6因特网域
AF_UNIX unix域
AF_UNSPEC 未指定

protocol
通常为0,表示按给定的域和套接字类型选择默认协议。

type
SOCK_STREAM 流式的套接字可以提供可靠的、面向连接的通讯流。它使用了TCP协议。TCP保证了数据传输的正确性和顺序性。
SOCK_DGRAM 数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。使用数据报协议UDP协议。
SOCK_RAW 原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。
SOCK_SEQPACKET 长度固定、有序、可靠的面向链接报文传递

字节序转换函数
uint32_t hton(uint32_t hostlong)
将一个32位整数由主机字节序转换成网络字节序
uint16_t htons(uint16_t hostshort )
将一个16位整数由主机字节序转换成网络字节序
uint32_t ntohl(uint32_t netlong)
将一个32位整数由网络字节序转换成主机字节序
uint16_t ntohs(uint16_t netshort)
将一个16位整数由网络字节序转换成主机字节序


通用地址结构

include<sys/socket.h>

struct sockaddr{
unsigned short sa_family; /* Internet地址族,AF_xxxx /
char sa_data[14]; /
14 bytes 的协议地址 */
}
sa_family 一般来说,IPV4使用AF_INET。
sa_data 包含一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一起的
在传递给需要地址结构的函数时,把指向该结构的指针转换成(struct sockaddr *)传递进去。


因特网地址结构
struct in_addr{
in_addr_t s_addr /* ipv4地址 */
}

struct sockaddr_in{
short int sin_family; /* Internet地址族如AF_INET(主机字节序) /
unsigned short int sin_port;/
端口号,16位值(网络字节序) /
struct in_addr sin_addr; /
Internet地址,32位IPv4地址(网络字节序) /
unsigned char sin_zero[8]; /
添0(为了格式对齐的填充位) */
}


IPv4地址族和字符地址间的转换

include<arp/inet.h>

const char *inet_ntop(int domain,const void *restrict addr,char *restrict str,socklen_t size);
返回:成功返回地址字符串指针,出错返回NULL
功能:网络字节序转换成点分十进制

int inet_pton(int domain,const char *restrict str,void *restrict addr);
返回:成功返回1,无效格式返回0,出错返回-1
功能:点分十进制转换为网络字节序

参数
domain: Internet地址族,如AF_INET
addr: Internet地址,32位IPv4地址(网络字节序)
str: 地址字符串(点分十进制)指针
size: 地址字符串大小


填写IPv4地址族结构案例
struct sockaddr_in sin; //定义一个sockaddr_in结构体
char buf[16];
memset(&sin,0,sizeof(sin)); //内存清零
sin.sin_family = AF_INET; //填写Internet地址族
sin.sin_port = htons((short)3001);//填写端口号(网络字节序)

//填充sin_addr
if(inet_pton(AF_INET,"192.168.2.1",&sin.sin_addr.s_addr)<=0){
//错误处理
}
printf("%s\n",inet_ntop(AF_INET,&sin.sin_addr.s_addr,buf,sizeof(buf)));


TCP客户端服务器编程模型
服务器端调用序列
调用socket函数创建套接字
调用bind绑定本地地址和端口
调用listen启动监听
调用accept从已连接列队中提取客服连接
调用I/O函数(read/write)与客户端通讯
调用close关闭套接字

客户端调用序列
调用socket函数创建套接字
调用connect连接服务器端
调用I/O函数(read/write)与客户端通讯
调用close关闭套接字

服务器
socket()                

bind()

listen()
                                客服端
accept()                        socket()

阻塞,等待客户数 <- 建立连接 ----   connect()

read() <------- 请求数据 -----  write()

处理服务请求

write() ------- 应答数据 -----> read()

close()                         close()

套接字与地址绑定
绑定地址
#include <sys/socket.h>
int bind(int sockfd,const struct sockaddr *addr,socklen_t len);
返回:成功返回0,出错返回-1

查找绑定到套接字的地址
int getsockname(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict alenp);
返回:成功返回0,出错返回-1

获取对方地址
int getpeername(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict alenp);
返回:成功返回0,出错返回-1

建立连接
服务器端
#include <sys/socket.h>
int listen(int sockfd,int backlog);
返回:成功返回0,出错返回-1。backlog指定进行客服端连接排队的队列长度
int accept(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict len);

客户端
int connect(int sockfd,const struct sockaddr *addr,socklen_t len);
返回:成功返回0,出错返回-1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 网络模型 物理层 物理层表示的是比特流传输,通常包括串口/COM口、并行/LPT口、USB、网线接口、电话线接口;...
    秋风弄影阅读 699评论 0 2
  • socket通信原理 socket又被叫做套接字,它就像连接到两端的插座孔一样,通过建立管道,将两个不同的进程之间...
    jiodg45阅读 1,111评论 0 1
  • 什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Inter...
    liuboxx1阅读 977评论 0 1
  • Socket创建函数 socket.socket(socket_family, socket_type, prot...
    JianMing阅读 6,005评论 1 13
  • 第19天·21天告别拖延 #玩卡不卡·每日一抽# 每一位都可以通过这张卡片觉察自己: 1、直觉他叫什么名字?坤 2...
    柳谊阅读 155评论 0 1