一、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
);
} }
网友评论