一、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请求一致,只不过响应体不会返回,这一方法可以在不必传输整个响应内容的情况下,就能获取包含在响应小消息头中的元信息。