网络编程-1

OSI模型

       OSI模型是最理想的模型

       物理层:传输的是bit流(0与1一样的数据),物理信号,没有格式

    链路层:格式变为帧(把数据分成包,一帧一帧的数据进行发送)

    网络层:路由器中是有算法的,ip,(主机到主机)(路由的转发)

    传输层:端口号,数据传输到具体那个进程程序  (端到端)

    会话层:通信管理,负责建立或者断开通信连接

    表示层:确保一个系统应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据加密,解密;

    应用层:指定特定应用的协议,文件传输,文件管理,电子邮件等。

TCP/IP协议族

应用层          TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet

传输层          TCP,UDP

网络层          IP,ICMP,RIP,OSPF,BGP,IGMP

网络接口与物理层      SLIP,CSLIP,PPP,ARP,RARP,MTU ISO2110,IEEE802.1,EEE802.

每层协议的详细介绍:

应用层:

HTTP(Hypertext Transfer Protocol) 超文本传输协议

万维网的数据通信的基础

FTP(File Transfer Protocol) 文件传输协议

是用于在网络上进行文件传输的一套标准协议,使用TCP传输

TFTP(Trivial File Transfer Protocol) 简单文件传输协议

是用于在网络上进行文件传输的一套标准协议,使用UDP传输

SMTP(Simple Mail Transfer Protocol) 简单邮件传输协议

一种提供可靠且有效的电子邮件传输的协议

传输层:

TCP(Transport Control Protocol) 传输控制协议

是一种面向连接的、可靠的、基于字节流的传输层通信协议

UDP(User Datagram Protocol) 用户数据报协议

是一种无连接、不可靠、快速传输的传输层通信协议

网络层:

IP(Internetworking Protocol) 网际互连协议

是指能够在多个不同网络间实现信息传输的协议

ICMP(Internet Control Message Protocol) 互联网控制信息协议

用于在IP主机、路由器之间传递控制消息

IGMP(Internet Group Management Protocol) 互联网组管理

是一个组播协议,用于主机和组播路由器之间通信

网络接口与物理层:

ARP 地址解析协议

通过ip地址可以获取到对方的mac地址

RARP 逆向地址解析协议

通过mac地址可以获取到对方ip地址

 TCP

TCP :全双工通信、 面向连接、可靠

TCP(即传输控制协议):

  • 是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、

              数据无失序、数据无重复到达的通信)

适用情况:

  • 适合于对传输质量要求较高,以及传输大量数据的通信。
  • 在需要可靠数据传输的场合,通常使用TCP协议
  • MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

 UDP

UDP :  全双工通信,无连接,不可靠

  • UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输
  • 适用情况:
  • 发送小尺寸数据(如对DNS服务器进行IP地址查询时)
  • 在接收到数据,给出应答较困难的网络中使用UDP。
  • 适合于广播/组播式通信中。
  • MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
  • 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输

Socket

Socket是一个编程接口;返回一种特殊的文件描述符 (everything in Unix is a file)

socket类型

流式套接字(SOCK_STREAM)   TCP

  • 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。

数据报套接字(SOCK_DGRAM)  UDP

  • 提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。

原始套接字(SOCK_RAW)

       可以对较低层次协议如IP、ICMP直接访问。

大小端:

小端序(little-endian) - 低序字节存储在低地址

大端序(big-endian)- 高序字节存储在低地址

  • 网络中传输的数据必须按网络字节序,即大端字节序
  • 在大部分PC机上,当应用进程将整数送入socket前,需要转化成网络字节序;当应用进程从socket取出整数后,要转化成小端字节序。
  • 主机字节序转化网络字节序?

          小端 转 大端       

inet_addr()
有主机字节序转化为网络字节序(大端),返回转换后的地址。
in_addr_t inet_addr(const char *strptr);

inet_ntoa()    
将32位网络字节序二进制地址转换成点分十进制的字符串。 
char *inet_ntoa(stuct in_addr inaddr);

主机字节序到网络字节序
u_long htonl (u_long hostlong);
u_short htons (u_short short);// host   to  inet   

网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);  //short 2字节

 TCP编程流程

 

服务器端:

       1) socket(),创建套接字文件,用于连接 sockfd(有一个属性默认是阻塞)

       2) bind(), 绑定,把socket()函数返回的文件描述符和IP、端口号进行绑定;

       3) listen(), (监听)将socket()返回的文件描述符的属性,由主动变为被动;  

       4) accept(), 阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,

                            则accept()函数返回,返回一个用于通信的套接字文件;

       5) recv(), 接收客户端发来的数据;   read()

       6) send(), 发送数据;

       7) close(), 关闭文件描述符;连接、通信

      

客户端:

       1) socket(),创建套接字文件,既用于连接,也用于通信;

              完成一个结构体的填充

       2) connect(); 用于发起连接请求;

       3) send(), 发送数据;

       4) recv(), 接收数据;

       5) close(), 关闭文件描述符;

 

socket
	NAME
       socket - create an endpoint for communication

	SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);
	   功能: 创建套接字文件
	   参数:
			domain:协议族
				 AF_UNIX, AF_LOCAL   用于本地通信
				 AF_INET             IPv4 Internet protocols          
				 AF_INET6            IPv6 Internet protocols          
			type:协议类型
				SOCK_STREAM	   TCP 
				SOCK_DGRAM     UDP	
                SOCK_RAW    原始套接字	
			protocol:
				一般情况下写0
				系统默认自动帮助匹配对应协议
				传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP
				网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)	
		返回值:
			成功: 返回一个特殊文件描述符;
			失败: -1 更新errno 
bind 
	int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
	功能: 绑定,将socket()返回值和IP/端口号进行绑定;
(以什么样的形式去绑定?就是填充第二个结构体,把端口号和IP填充到这个结构体中)
	参数:
		sockfd:  是socket()函数的返回值;
		const struct sockaddr *addr:
			struct sockaddr是结构体类型,是一个通用结构体;
			    struct sockaddr {
					sa_family_t sa_family;    // 2个字节typedef unsigned short int a_family_t;  //
					char        sa_data[14];  // 14字节
				}
        addrlen:
			结构体的大小;
				sizeof(serveraddr);
		返回值:0
			-1  失败,更新errno

listen 
	int listen(int sockfd, int backlog);
	功能: 用于监听,将主动套接字变为被动套接字;
	参数:
		sockfd:  socket()的返回值
		backlog:客户端同时连接服务器的最大个数;
           不同平台可同时链接的数不同,一般写6-8个
(队列1:保存正在连接)
			    (队列2,连接上的客户端)
	返回值:
		失败 -1
accept
	int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
		accept(sockfd,NULL,NULL);
		阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,
				则accept()函数返回,返回一个用于通信的套接字文件;
	参数:
		Sockfd :套接字
		addr: 链接客户端的ip和端口号
  如果不需要关心具体是哪一个客户端,那么可以填NULL;
		addrlen:结构体的大小
如果不需要关心具体是哪一个客户端,那么可以填NULL;
	返回值: 
		成功:文件描述符; //用于通信
		acceptfd;
失败:-1,更新errno
		
 recv   
	ssize_t recv(int sockfd, void *buf, size_t len, int flags);
	功能: 接收数据 
	参数: 
		sockfd: acceptfd ;
		buf  存放位置
		len  大小
		flags  一般填0,相当于read()函数
		
			MSG_DONTWAIT  非阻塞
	返回值: 
		< 0  失败出错
		==0  表示客户端退出
		>0   成功接收的字节个数
	
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
	功能:用于连接服务器;
	参数:
		sockfd:socket函数的返回值
		addr:	
			填充的结构体是服务器端的;
		addrlen:
			结构体的大小
	返回值 
		-1 失败
		正确 0 
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
	功能:发送数据
	参数:
		sockfd:socket函数的返回值
		buf:发送内容存放的地址
		len:发送内存的长度
		flags	:	如果填0,相当于write();
函数:atoi  功能是将数字字符串转换为数值
#include <stdlib.h>
 int atoi(const char *nptr);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值