linux网络编程基础

1、OSI网络七层模型 协议 作用
[应用层 ]应用层 A: 提供应用程序间通信 TFTP、HTTP、FTP、 文件传输,电子邮件,文件服务,虚拟终端
[应用层 ]表示层 P: 处理数据格式、数据加密等 Telnet,Rlogin,SNMP,Gopher 数据格式化,代码转换,数据加密
[应用层 ]会话层 S: 建立、维护和管理会话 SMTP,DNS 解除或建立与别的节点的联系
[传输层 ]传输层 T: 建立主机端到端的连接 TCP、UDP 提供端对端的接口
[网络层 ]网络层 N: 寻址和路由选择 IP、ICMP、OSPF、BGP、IGMP、ARP、RARP 为数据包选择路由
[网络接口层]数据链路层 D: 提供介质访问、链路管理等 SLIP、PPP、MTU 传输有地址的帧以及错误检测功能
[网络接口层]物理层 P: 比特流传输 ISO2110,IEEE802,IEEE802.2 以二进制数据形式在物理媒体上传输数据

常用协议:
TCP(Transport Control Protocal):传输控制协议
IP(Internetworking Protocal): 网间协议
UDP(User Datagram Protocal): 用户术报协议
ICMP(Internet Control Message Protocal):互联网控制信息协议
SMTP(Simple Network Manage Protocal): 简单网络管理协议
HTTP(Hypertext Transfer Protocal): 超文本传输协议
FTP(File Transfer Protocal):文件传输协议
ARP(Address Resolution Protocal):地址解析协议

2、TCP(传输控制协议) VS UDP(用户数据包协议)
TCP:有连接,可靠
TCP特点:
1)面向连接的传输
2)端到端的通信
3)高可靠性,确保传输数据的正确性,不出现丢失或乱序
4)全双工方式防暑
5)采用字节流方式,即以字节为单位传输字节序列
6)紧急数据传送功能

UDP:无连接,不保证可靠

TCP与UDP的区别:
1)TCP协议面向连接,UDP协议面向非连接
2)TCP协议传输速度慢,UDP协议传输速度快
3)TCP协议保证数据正确性,UDP协议不保证
4)TCP协议保证数据正确性,UDP协议可能丢包
5)TCP协议对系统资源要求多,UDP协议要求少

三次握手:
A向B发消息:
A - SYN-> B (SYN received)
A <- SYNACK- B
A -Eatablished -> B
3、Socket
Socket类型:
SOCK_STREAM:按照顺序、可靠的数据完整的基于字节流的连接,使用TCP来传输
SOCK_DGRAM:无连接,固定长度的传输调用,不可靠协议,使用UDP来连接
SOCK_RAW: 提供单一提的网络访问,使用ICMP公共协议

struct sockaddr
{
short int sa_family;
char aa_data[14];
};
sa_family:用来标识地址类型

AF: address family
PF:Protocal family

//for ipv4
struct sockaddr_in
{
sa_family sim_family;
struct in_addr sin_addr;
unsigned short int sin_port;
}

//for ipv6
struct sockaddr_in6
{
sa_family sin6_family;
struct in_addr sin6_addr;
unsigned short int sin6_port;
}

4、字节序:指多字节数据在计算机内存中存储或者网络传输时各字节的传输顺序

//常见字节序:
大端模式:低位存高地址,高位存低地址
小端模式:低位存低地址,高位存高地址

主机序:
网络序: 大端序

字节序转换: 转换的是IP地址
	主机序转网络序:
		u_long htonl(u_long hostlong);
		u_short htons(u_short short);
		
	网络序转主机序:
		u_long ntohl(u_long hostlong);
		u_short ntohs(u_short short);

IP地址的转换:
	// address to network
	int inet_aton(const char *cp,struct in_addr inp); // inet_aton("192.168.2.1",&my_addr)
	
	in_addr_t inet_addr(const char *cp);
	//network to address 
	char *inet_ntoa(struct in_addr in);

5、DNS
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
#define h_addr h_addr_list[0];
};

struct hostent *gethostbyname(const char *name);

6、socket 编程
/server*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <arpa/inet.h>

//server.c
int main()
{
int server_fd;
int client_fd;
struct sockaddr_in myaddr;
struct sockaddr_in client_addr;
myaddr.sun_family = AF_INET;
myaddr.sin_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(8080);

int client_addr_len = sizeof(client_addr);


//1.socket 
server_fd = socket(AF_INET,SOCK_STREAM,0);
if(serverfd == -1)
{
	printf("socket error !\n");
	exit(1);
}
// 2.bind
if(bind(serverfd,(struct sockaddr *)&myaddr,sizeof(myaddr)) == -1)
{
	perror("bind error !\n");
	exit(1);
}
// 3. listen
if(listen(server_fd,20 ) == -1) // 20 times 
{
	perror("listen error !\n");
	exit(1);
}
// 4. accept
client_fd = accept(server_fd,(struct sockaddr *)&client_addr,&client_addr_len);
if(client_fd == -1)
{
	perror("accept error !\n");
	exit(1);
}
// 5. op 
write(client_fd,"hello test",10);

// 6. close	
close(client_fd);
close(server_fd);

return 0;

}
/client*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>

//client.c
int main()
{
int server_fd;
int client_fd;
char buf[100];
struct sockaddr_in myaddr;
struct sockaddr_in client_addr;
myaddr.sun_family = AF_INET;
myaddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);
myaddr.sin_port = htons(8080);
int client_addr_len = sizeof(client_addr);

//1.socket 
server_fd = socket(AF_INET,SOCK_STREAM,0);
if(serverfd == -1)
{
	printf("socket error !\n");
	exit(1);
}

//2.connect 
if(connect(serverfd,(struct sockaddr *)&myaddr,sizeof(myaddr)) == -1)
{
	perror("connect error !\n");
	exit(1);
}

// 3. op 
read(serverfd,buf,100);
printf(" get server data = %s !\n",buf);
// 6. close	
close(server_fd);

return 0;

}
/*******************/

7、HTTP协议
http(超文本传输协议):是一种基于请求和相应模式的、无状态的、应用层的协议,长基于TCP的连接方式。

HTTP URL格式:
http://host[":"port][abs_path] eg: http://192.168.0.116:8080/index.jsp

HTTP 发送请求:
由三部分组成:请求行、消息报头、请求正文
请求行以一个方法符号开头,以空格分开,后面跟着请求的URL和协议的版本,格式如下:
Method Request-URL HTTP-version CRLF
其中,Method表示请求方法:Request-URL是一个统一资源标识符;HTTP-version表示请求的HTTP协议版本,CRLF表示回车和换行

	请求方法分类如下:
		GET:请求获取Reques-URL所标识的资源
		POST:在Request-URL所标识的资源后附加新的数据
		HEAD:请求获取由Request-URL所标识的资源的相应消息报头
		PUT:请求服务器存储一个资源,并用Request-URL作为其标识
		DELETE:请求服务器删除Request-URL所标识的资源
		TRACE:请求服务器会送收到的请求信息,主要用于测试或诊断
		CONNECT:保留将未使用 

HTTP 接收响应:
由三部分组成:状态行、消息包头、响应正文
状态行格式如下:
[HTTP-Version] [Status-Code] Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本,Status-Code表示服务器发回的相应状态代码,Reason-Phrase表示状态代码的文本描述

状态代码有三位数字组成,第一个数据定义了响应的类别,具有物种可能取值:
1xx:指示信息-表示请求已接收,继续处理
2xx:成功-表示请求已被成功接受、理解、接受 
3xx:重定向-要完成请求必须进行更进一步的操作
4xx:客户端错误-请求有语法错误或请求无法实现
5xx:服务器端错误-服务器未能实现合法的请求

常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在 eg:输入了错去的URL 
500 Internal Server Error //服务器发生与可预期的错误
503 Server Unsvailable //服务器当前不能处理客户端的请求,一段时间可能恢复正常

HTTP消息报头包括普通报头、请求报头、响应报头和实体报头

/socket源码追踪******/
net.h — socket内核对象结构
enum sock_type
struct socket_wq
struct socket
struct file
struct sock
struct proto_ops
socket.c —

/********************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值