Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335720
  • 博文数量: 124
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 321
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-04 16:09
文章分类

全部博文(124)

文章存档

2014年(124)

分类: 嵌入式

2014-08-19 11:44:13

主要内容有:推荐书籍《UNIX环境高级编程》,简称AQUE.以及华清教学课件“Linux网络编程”部分。

(1)OSI模型和TCP/IP协议的模型

(2)TCP和UDP协议下的服务器和客户端的设计

(3)I/O模型

(4)服务器模型

(5)广播和组播模型

(6)UNIX域套接字

一、OSI模型和TCP/IP协议的模型

TCP/IP协议中,TCP是用来检测网络传输中差错的传输控制协议,IP协议专门负责对不同网络进行互联的互联网络协议。他们的前身是美国的ARPnet的NCP协议。

网络的体系结构是指“网络的层次结构”和每层所使用的协议的集合“。 最重要的两个网络体系结构是:TCP/IP和OSI

         OSI参考模型与TCP/IP参考模型的比较:                                                           OSI参考模型

           

面向应用 --> 应用层 -->应用程序:FTP、E-mail、Telent等
面向服务 -->表示层  --> 数据格式定义、数据转换 / 加密
面向服务 -->会话层 -->建立通信进程的逻辑名字和物理名字之间的联系


面向通信 --> 传输层 --> 差错处理/恢复,流量控制,提供可靠的数据传输

通信子网 --> 网络层 --> 数据的分组和路由的选择

通信子网 --> 链路层 --> 数据组成可发送\接受的帧

通信子网 --> 物理层 --> 传输物理信号\接口\信号心事\速率

TCP协议中只有一下四层:

应用层\传输层\网络层\网络接口和物理层

常见的TCP/IP协议族有:

TCP、IP、UDP、ICMP、SMTP、SNMP、HTTP、TFP、ARP



                                            TCP的数据包的格式

  

二、TCP和UDP协议下的服务器和客户端的设计

(1)TCP和UDP的区别,虽然都工作在传输层,全双工

TCP:可靠,有连接;数据无误、无丢失、无失序、无重复到达。

UDP:不可靠,无连接;效率很高

(2)socket的介绍,sock位于传输层和会话层

分为三种套接字:sock_stream、sock_dgram和sock_ram(原始套接字)

(3)IP地址:我们平时用的是十进制的点分形式,而最后都会转换为一个无符号的32位整数

常用函数:

inet_aton(); //将字符串转换为32位的网络字节序数

inet_addr(); //将字符串转换为32位的网络字节序数

inet_ntoa(); //转换为32位的网络字节序数转换为点分十进制的字符串

(4)端口号:

常用函数:

主机字节序 --> 网络字节序

htonl(); //用于IP

Htons(); //用于端口号

网络字节序 --> 主机字节序

ntohl();

ntohs();

(5)网络字节序:是大端的。

(6)socket地址相关的数据结构

A、通用地质结构

struct socketaddr

{

u_short sa_family;//地址协议族,AF_XXX

char sa_data[14] //14字节协议地址

};

B、Inetnet协议地址结构

struct socketaddr_in

{

u_short sin_family;

u_short sin_port;

struct in_addr sin_addr; //ipv4地址,4byte

char sin_zero[8]; //8tyte 作为填充

};

C、IPV4的地质结构

struct in_addr

{

in_addr_t s_addr; //u32 network address

};

(7)TCP服务器的设计

A、创建socket文件描述符 sockfd = socket(AF_INET, SOCK_DGRAM, 0);

B、填充地址结构

bzero(&peeraddr, sizeof(peeraddr));
peeraddr.sin_family = PF_INET;
peeraddr.sin_port = htons(atoi(argv[2]));
peeraddr.sin_addr.s_addr = inet_addr(argv[1]);

C、将文件描述符和地质结构进行绑定   bind();

D、设置监听套接字,因为sockfd只能用来连接,不能通信  listen(listenfd);

E、得到一个建立好的套接字来连接 int new_fd accept();

F、数据的发送和接收

send()/recv()

(8)TCP客户端的设计

A、同样创建socket文件描述符 sockfd = socket(AF_INET, SOCK_DGRAM, 0);

B、填充地址结构

bzero(&peeraddr, sizeof(peeraddr));
peeraddr.sin_family = PF_INET;
peeraddr.sin_port = htons(atoi(argv[2]));
peeraddr.sin_addr.s_addr = inet_addr(argv[1]);

C、这歌绑定是可选的,将文件描述符和地质结构进行绑定   bind();

D、同服务器的accept一样,客户端也有一个专门的connect(sockfd),得到一个建立好的套接字来连接.

F、数据的发送和接收

send()/recv()

阅读(2018) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~