iOS-网络学习1

2021-08-21  本文已影响0人  快乐的tomato

一、OSI 7层参考模型

OSI 7层参考模型参考模型.png

二、HTTP

1、什么是HTTP?

超文本传输协议的简称,通过这个协议我们可以向服务端发起请求,获得服务端的数据。这也是我们开发人员需要操作的。

2、HTTP工作原理?

HTTP协议采用了请求/响应模型,客户端按照一定的格式要求向服务器发送一个请求报文,服务器会返回我们一定格式内容。如果不按照格式去写,是请求不到数据的。

过程:
1、客户端先与服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
2、通过TCP套接字,客户端向Web服务器发送一个请求报文。
3、服务器接受请求并返回HTTP响应。
4、释放连接TCP连接。
5、客户端解析并显示返回的内容。

3、请求报文格式

请求报文格式包括:请求行、请求头部和请求数据

image.png image.png

最常用的是get和post方法。

get的的特点

1、请求的参数放在URL后面
2、是安全性的。就是不会改变数据,仅仅是查询。
3、是幂等的。发起请求的结果都是一样的。
4、会被浏览器主动缓存
5、GET 方法的 URL 一般都具有长度限制,这个长度限制主要是由浏览器和 Web 服务器所决定的。
6、GET 方法只产生一个 TCP 数据包。

post的的特点
1、是将请求信息放置在请求数据中的。
2、因为有可能修改服务器上的资源,所以它是不符合安全和幂等性的。
3、请求信息是没有长度限制的。
4、POST 方法会产生两个 TCP 数据包。

4、响应格式

主要包括状态行、响应头部、响应正文。


image.png
image.png

常见状态码:
2xx 请求已成功被服务器接收、理解、并接受。
4xx 客户端看起来可能发生了错误,妨碍了服务器的处理。
5xx 服务器在处理请求的过程中有错误或者异常状态发生。

5、HTTP的特点

1、无连接:服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。
2、无状态:对于发送过的请求或响应都不做持久化处理。
为了弥补这种不足,产生了两项记录http状态的技术,一个叫做Cookie,一个叫做Session,后面我们再细讲它们。


三、TCP

1、什么是TCP?

传输控制协议的简称。是一种面向连接的、可靠的、基于字节流的传输层通信协议
在用HTTP发送数据之前,需要TCP进行连接。
TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。这个不需要我们程序员去管理,各个平台的操作系统都已封装好,我们直接去用就好了。

2、TCP的连接过程

连接的过程:三次握手、数据传输、四次分手。

image.jpeg

三次握手的目的就是客户端和移动端双方建立连接,即双方开辟队列空间
双方有资源为对方就是有连接了。

1、客户端向服务端发送一个含有SYN的数据包
2、服务端接收到这个SYN包之后,向客户端发送一个SYN+ACK的包
3、客户端收到SYN+ACK的包后,再把含有ACK的包发给服务端

SYN:同步序列编号(Synchronize Sequence Numbers)
ACK :确认字符 (Acknowledge character)

为什么是3次握手?
主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而>产生错误,减少不必要的错误和资源的费。
2次可能会浪费资源,4次多余。

三次握手建立连接,开始进行数据的传输,传输完之后连接就要断开

断开连接双方销毁资源

1、客户端向服务端发送一个含有FIN的数据包
2、服务端接收到这个FIN包之后,向客户端发送一个FIN+ACK的包
3、服务端紧接着发送一个FIN包向客户端
4、客户端把含有ACK的包发给服务端
FIN:结束(finsh)

为什么四次分手?
关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。


三、Socket

1、什么是Socket?

接口四元组: ip+port:ip+port,保证连接的唯一性
Socket编程理解为对TCP协议的具体实现,介于应用层和传输层之间。


image.png

2、Socket的工作过程

1、创建Socket
2、连接到服务器
3、发送数据给服务器
4、从服务器接收数据
5、关闭连接
从Socket的工作过程也可以看出跟TCP的工程过程差不多,所以也可以理解为对Socket编程理解为对TCP协议的具体实现。

3、Socket的简单实现

-(void)useSocket{
/*
 1、创建Socket:第一个参数,domin 协议族 制定IPv4
            第二个参数,type Socket类型
              第三个参数,protocol 协议
 */
    int clientSocket = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
    
    /*
     2、连接服务器:
     */
    
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;//协议类型
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");//ip地址
    addr.sin_port = htons(80);//端口
    int result = connect(clientSocket,(const struct sockaddr *)&addr, sizeof(addr));
//    if (result==0) {
//        NSLog(@"成功");
//    }else{
//        NSLog(@"失败");
//    }
    
    if (result !=0) {
        
        NSLog(@"失败");
    }
    
    //3、向服务器发送信息
    const char *mag = "ni hao";
    ssize_t sendCount =  send(clientSocket, mag, strlen(mag), 0);
    NSLog(@"发送的字节数==%zd",sendCount);
    
    
    //4、向服务器发送信息
    uint8_t buffer[1024];
    ssize_t recvCount = recv(clientSocket, buffer, sizeof(buffer), 0);
    NSLog(@"发送的字节数==%zd",recvCount);
    
    //把字符数组转化成字符串
    NSData *data = [NSData dataWithBytes:buffer length:recvCount];
    NSString *recv = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"收到数据==%@",recv);
    
    //5、关闭连接
    close(clientSocket);
}

四、iOS中简单实现网络请求

项目中要比这复杂,要进行各种加密、编码等等,这里只是简单示范。

#pragma mark - Http的使用
/*
 iOS 7.0 以后使用NSURLSession 替代 NSURLConnection 来发送网络请求。
 NSURLSession的特点:
 1、支持后台运行网络任务
 2、暂停、停止、重启网路任务,不需要自己z再封装NSOperation
 3、下载、断点续传、异步下载
 4、获取下载、上传的进度
 5、默认所有的服务都是挂起的
 
 */
-(void)dataTaskWithHttp{
    
    //默认是get请求
    NSURL *url = [NSURL URLWithString:@"http://ldu.fanya.chaoxing.com/portal"];//请求地址
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"post";//请求方式
    NSString *body = @"username=123&password=123";//请求体
    request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
    
    //发起请求
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
//        id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        NSLog(@"请求返回的数据==%@",data);
        
    }];
    
    //任务默认是挂起的,开启任务
    [dataTask resume];
}

请求返回的结果,由于data不知后台解析的方法,所以没哟做解析

2021-08-22 13:22:08.562998+0800 Study[95854:1776782] 请求返回的数据data=={length = 16230, bytes = 0x3c21444f 43545950 45206874 6d6c2050 ... 0a3c2f68 746d6c3e }
2021-08-22 13:22:08.563708+0800 Study[95854:1776782] 请求返回的数据response==<NSHTTPURLResponse: 0x600000d45ec0> { URL: http://ldu.fanya.chaoxing.com/portal } { Status Code: 200, Headers {
    Connection =     (
        "keep-alive"
    );
    "Content-Encoding" =     (
        gzip
    );
    "Content-Type" =     (
        "text/html;charset=UTF-8"
    );
    Date =     (
        "Sun, 22 Aug 2021 05:15:21 GMT"
    );
    P3P =     (
        "CP=CAO PSA OUR"
    );
    "Set-Cookie" =     (
        "JSESSIONID=7F0FF0824691664C169933FE6CA27905.jvm1402; Path=/; HttpOnly",
        "fanyamoocs=11401F839C536D9E; Domain=chaoxing.com; Path=/; HttpOnly",
        "route1=67f81b350dca6d80ab086f60f29cf817; Path=/"
    );
    "Transfer-Encoding" =     (
        Identity
    );
    Vary =     (
        "Accept-Encoding"
    );
    "X-FRAME-OPTIONS" =     (
        SAMEORIGIN
    );
} }

参考:
HTTP协议超级详解
请说说GET和POST请求有什么区别?
TCP 详解

上一篇 下一篇

猜你喜欢

热点阅读