网络协议的简单梳理--socket、http、https、tcp、ip

一、socket

1、socket套接字是通信的基石,是支持TCP/IP协议的基本操作单元,包含进行网络通信的五种信息

       1> 链接使用的协议

      2> 本地主机的IP地址

      3> 本地进程的协议端口

     4> 远地主机的IP地址

     5> 远地进程的协议端口

      多个TCP链接或者多个应用程序进程可能需要通过同一个TCP端口传输数据,操作系统为应用程序与TCP/IP提供了socket套接字来区分,实现数据传输的并发服务

2、socket套接字的链接

   首先需要一对套接字,其中一个运行于客户端---clientSocket,另一个在服务器端serverSocket,套接字的链接需要三步

    1》服务器监听    2》客户端请求   3》确定链接  他可以接受不同的传输协议:TCP或者UDP

    客户端与服务器建立链接的流程图

创建socket套接字

socket(af,type,protocol)    建立地址和套接字的联系

bind(socket,local,addr,addrlen)      服务器监听客户端的请求

listen(socket,quenlen)      建立服务器和客户端的链接面向TCP

客户端请求链接

connect(socket,sestaddr,addrlen)       服务器等待从XXX编号的socket上接受客户的请求

newSocket = accept (sockid,clientaddr,paddrlen)     发送数据接收

面向链接

send(socket,buff,bufflen)

释放套接字

close(socketed) 

在iOS中。以NSStream数据流来发送和接收数据,可以设置流的代理,对流的状态做出相应的动作------建立链接、收到链接、链接关闭

NSStream继承自CoreFoundation,NSInputStream是用于读取输入,是NSStream的子类

socket编程步骤  c语言版

1、导入<arpa/inet.h>,<netdb.h>

2、创建socket

int socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0);

if (-1 == socketFileDescriptor) {    

NSLog(@"创建失败");  

   return; }

3、获取IP地址

struct hostent * remoteHostEnt = gethostbyname([host UTF8String]);

if (NULL == remoteHostEnt){

      close(socketFileDescriptor);

      NSLog(@"%@",@"无法解析服务器的主机名");

      return;

}

4、设置参数

struct in_addr * remoteInAddr = (struct in_addr *)remoteHostEnt->h_addr_list[0];

struct sockaddr_in socketParameters;

socketParameters.sin_family = AF_INET;

socketParameters.sin_addr = *remoteInAddr;

socketParameters.sin_port = htons([port intValue]);

5、链接socket

int ret = connect(socketFileDescriptor, (struct sockaddr *) &socketParameters, sizeof(socketParameters));

if (-1 == ret) {

      close(socketFileDescriptor);

      NSLog(@"连接失败");

      return;

}

NSLog(@"连接成功"); }

在实际开发中一般用CocoaAsynCocket是一个开源的库支持TCP和UMP

1、与服务器通过三次握手建立链接

……..关于CocoaAnynSocket专门写帖子

与服务器建立链接的原理

1、网络的七层协议

HTTP是应用层的网络协议,TCP是传输层的协议,IP是网络协议,TCP/IP是传输层协议,主要解决数据如何在网络中传输,HTTP解决如何包装数据的,而socket是应用层与TCP/IP协议之间的抽象层,是他的一组接口

TCP/IP的五层模型

应用层,传输层,网络层(路由器),数据链路层(交换机、网卡、以太网),物理层(双绞线)

TCP/IP是传输层协议,HTTP是应用层协议,基于TCP/IP协议,在传输数据的时候可以只有引用层,但无法识别数据的类容,如果想要传输的数据有意义,那么就必须使用应用层的协议:HTTP、FTP、等协议

socket是在应用层和传输层之间的长链接接口,是对TCP/IP协议的封装,本身并不是协议,但只有通过socket才能使用传输协议。网络层的通信就是socket之间的通信,HTTP、XMPP等的实质就是socket之间的通信

TCP:传输控制协议

1、TCP可以对上层网络提供接口,通过三次握手建立链接,形成数据传输通道,在客户端与服务器端进行大量的数据传输,是点到点的通信

2、TCP的连接:三次握手

1>客户端发送syn包(syn = j)到服务器,进入syn_send状态,等待确认

2>服务器接受到syn包,确认客端的syn(ack = j+1)包,同时给自己发送一个syn包,进入syn_recv,等待状态

3>客户端收到服务器的syn+ack包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器端进入链接状态,完成三次握手

注意++

三次握手过程中传送的包里是没有数据的,三次握手完毕客户端与服务器才正式开始传输数据。理想状态下TCP一旦建立链接,在通信双方任何一方主动关闭之前,tcp都会保持下去,客户端和服务器端都可以主动断开链接,断开链接需要四次握手

UDP:用户数据包协议

主要将数据及目的源封装成数据包,不需要建立链接,每个数据包的大小为64k,是点到点的通信,比如发送音频、视频,少一帧都没关系

HTTP超文本传输协议

HTTP是建立在TCP/IP协议之上的应用层协议,是客户端发起请求,服务器做出响应,在做出响应之后服务器主动断开,从建立到关闭的过程一次链接,所以是短连接,如果要保持客户端一直在线状态就需要不断的向服务器发送请求

HTTPS:是安全的HTTP,在HTTP下加了SSL层,安全基础是SSL,因此加密的详细内容就需要SSL,HTTP是以明文的方式发送内容,HTTPS需要ca证书,是和HTTP完全不同的链接方式,端口也是不一样的,HTTP是80端口,而HTTPS是443端口

HTTPS的链接过程:客户端发起HTTPS链接,服务器返回一个证书的公钥,客户端随机产生一个对称秘钥,使公钥对对称秘钥加密,发送加密后的对称秘钥,通过对称秘钥加密的密文通信

HTTP的请求方式:post、get、put、head、options、

一个URL描述一个网络上的资源,一般post提交数据,get获取数据,但其实get也能提交数据

在HTTP头部有两个报文:请求报文和响应报文

请求报文由:请求行、请求头部、空行、请求数据组成

响应报文由:状态行、消息报头部、响应正文组成

请求行:是请求的路径

请求头部:对客户端的描述;比如是ios或者android

空行和请求数据只有post用来提交数据

响应报文状态行:对HTTP协议版本和状态码的回应,比如404

消息头部:对服务器的描述

响应正文:给客户端的具体数据

GET:是在一个URL后边直接拼接参数,不适合大量的数据,长度有限,一般为1024个字节,oc默认的是get请求。将请求的数据放在协议的头部,以‘ ?’隔开,多个参数用&连接,英文原样发送,空格转成十进制

POST:它请求的数据是在请求体重,比较安全,大小理论上没有限制。

get:向特定的资源发出请求,他本质就是发送一个请求来取得服务器上的某一资源,通过一组HTTP头和呈现数据,get请求中永远不会包含成数据

post:向指定资源提交数据进行处理请求,数据被包含在请求体中,post请求可能会导致新的资源的建立或已有资源的修改

put:向指定资源位置上传最新的内容

head:向服务器索取与get请求一致,只不过响应体不会返回,这一方法可以在不必传输整个响应内容的情况下,就能获取包含在响应小消息头中的元信息。

猜你喜欢

转载自blog.csdn.net/ningn111/article/details/82152439