知道“3次握手”吗?突然想起这个词

什么是3次握手?

TCP三次握手/四次挥手详解 这里是3次握手的详解

3次握手就是为了可靠的传送数据,TCP(什么是TCP呢?TCP就是一种可靠传输的协议)在发送数据之前。两台主机之间进行3次握手。3次握手完毕后才发送数据。

预备知识: 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到server,主机B由SYN=1知道。A要求建立联机。

第二次握手:主机B收到请求后要确认联机信息。向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完毕三次握手。主机A与主机B開始传送数据。

进入正题:

iOS 中首选的通信方式是HTTP。iOS提供的最方便的网络API也是针对HTTP的。

上文中说的“三次握手”就是为了建立一个TCP连接,HTTP请求和响应就是在TCP连接上来完毕的,TCP连接能够重用,也就是说。并非每次HTTP请求都须要建立TCP连接,仅仅要TCP连接不断开,HTTP请求就能够一直使用。

HTTP和HTTPS的区别在什么地方?

安全。事实上HTTPS协议就是SSL+HTTP协议。

HTTPS和HTTP之间最重要的区别在于会话的建立阶段。TCP连接建立好之后,HTTP请求发送之前。client与server之间必须建立SSL(那么SSL又是什么呢?以下说)会话。会话建立完毕后,在TCP连接之上传输的全部数据都是加密的。

SSL是什么?

SSL (Secure Socket Layer),是一种保证server和client安全通信的协议。使用HTTPS协议。全部的HTTP数据都是在SSL协议封装之上传输的。突然冒出另外一个词TLS,事实上TLS是SSL标准化的产物,事实上我们如今用的都是TLS。但由于历史上习惯了SSL这个称呼寻常还是以SSL为多。关于SSL的介绍看下这篇文章讲的非常好SSL/TLS协议执行机制的概述

iOS 最高层的HTTP API

NSURL 、NSURLRequest 、NSURLConnection 、NSURLResponse 对象

1 NSURL

通过NSURL 对象轻松方便的訪问URL所指向的内容,NSURL 能够指向文件资源,也能够指向网络资源。

NSURL *url = [NSURL URLWithString:@”“];

NSData *data = [NSData dataWithContentsOfURL:url];

即能够获取网络资源又能够获文件资源。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    NSInputStream *inStream = [NSInputStream inputStreamWithFileAtPath:@"文件路径"];
[request setHTTPBodyStream:inStream];

NSURL还提供了非常多方法来读取URL各个部分的值,比方url.port获取一下url的端口。

在创建NSURL对象前须要对URL字符串进行百分号编码。RFC3986文档规定,Url中仅仅同意包括英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及全部保留字符。相关更具体的看百分号编码

2 NSURLRequest

创建好NSURL对象后接下来就须要执行下一步:创建NSURLRequest对象。NSURLRequest 对象包括了载入URL内容所需的信息。iOS中的URL载入系统支持HTTP 、HTTPS、FTP和FILE URL内容的载入

URL载入系统提供了一种扩展方式一处理新的协议,方式就是创建NSURLProtocol的子类。然后将返回的结果提供给URL载入系统。

NSURL *url = [NSURL URLWithString:@"www.baidu.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

採用默认的參数来创建对象。

假设是HTTP或者HTTPS 那么请求方法是GET,而且使用操作系统提供的默认头。

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];

设置缓存策略和请求时间,NSURLRequest也提供了很多方法来获取请求的属性。可是不能设置,假设想要设置,那么来用NSMutableRequest。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[@"body" dataUsingEncoding:NSUTF8StringEncoding]];
[request setAllHTTPHeaderFields:@{@"":@""}];

NSMutableRequest 设置各种參数。

发送大容量内容能够使用NSInputSteam,使用该对象提供请求体而无需将整个内容载入到内存中。发送图片或者视频这是最佳的选择。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSInputStream *inStream = [NSInputStream inputStreamWithFileAtPath:@"文件路径"];
[request setHTTPBodyStream:inStream];

3 NSURLConnection

NSURLConnection 对象是URL载入统统活动的中心。用于连接server获取响应。

提供了同步、异步、队列异步的操作模式。

同步最简单,可是会有阻塞线程等缺点。异步模式下调用托付代理来处理数据。

4 NSURLReponse

NSURLResponse 对象会在URL载入请求完毕后返回。NSError对象与DSData对象,假设请求出现故障或server问题会返回NSError对象,假设有响应返回NSData对象就会包括响应体.

NSURLReponse提供了非常多属性信息。

MIMEType 结果数据的MIME类型。该值来源于server。

expectedContentLenth 返回内容的大小,可能与实际不符。

suggestedFilename 提供的文件名称,要么来自server提供的内容的文件名称,要么来自URL和MIME类型。

URL 返回内容的URL。

由于成定向的原因,URL可能与请求提供的URL不同。

textEncodingName 最初数据源所用的文本编码名。

HSHTTPURLResponse 是NSURLResponse的子类,它包括特定于HTTP请求的属性。

响应头 - allHeaderFields

HTTP状态码 - statusCode

文章来自《iOS高级编程》 扫盲

iOS -读书笔记-网络请求的更多相关文章

  1. iOS学习笔记---网络请求

    一.HTTP协议的概念 HTTP协议:Hyper Text Transfer Protocol(超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议.HTTP是一个应用层协议,由请求和 ...

  2. iOS美丽约网络请求分析

    网络请求分析html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padd ...

  3. iOS基础之网络请求相关

    1.AFNetwork二次封装方法一: #import <Foundation/Foundation.h> @interface BeeNetworkManager : NSObject ...

  4. iOS 串行网络请求。。。待研究

    nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里? 我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始. AFNetwor ...

  5. ios编程之网络请求

    网络请求有GET请求和POST请求,get和post实现的时候可以选择同步或者异步实现.看一个请求是GET还是POST就看网址后面有没有携带请求体. GET与POST 区别  1.get请求 请求的网 ...

  6. iOS中的网络请求 和 网络监测

    1.网络监测 //根据主机名判断网络是否连接 Reachability *reach = [Reachability reachabilityWithHostName:@"www.baidu ...

  7. iOS开发之网络请求(基于AFNetworking的再封装)

    最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...

  8. 《android开发进阶从小工到专家》读书笔记--网络框架的设计与实现

    第一步: 第一层:Request--请求类型,JSON,字符串,文件 第二层:消息队列--维护了提交给网络框架的请求列表,并且根据响应的规则进行排序.默认情况下按照优先级和进入队列的顺序来执行,该队列 ...

  9. ios中封装网络请求类

    #import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 ...

随机推荐

  1. 运行npm start vue.js项目 出现 npm ERR! missing script: start 错误

    npm ERR! missing script: start 错误 有可能缺少依赖包,运行nmp install安装依赖(一般都依赖很多包,过程有点慢),安装完后发现多一个 node_modules文 ...

  2. Raspberry Pi - 调整你的SD卡分割区的大小

    在使用Win32DiskImager为一张空白的SD卡刷入新的Rasbian系统后,卡上的可用剩余空间并不大, 本人有一张8G的SD卡,但是刷入4.1的Rasbian后,用df -h查看,根目录下的空 ...

  3. Fans同学已死,终年24岁

    亲爱的同学们,朋友们,QQ好友. 告诉大家一个悲剧:Fans同学已死,终年24岁. 马甲变迁 正式告诉大家一个消息,我的ID"Fans同学"正在退出"历史舞台" ...

  4. 【Codeforces Round #422 (Div. 2) D】My pretty girl Noora

    [题目链接]:http://codeforces.com/contest/822/problem/D [题意] 有n个人参加选美比赛; 要求把这n个人分成若干个相同大小的组; 每个组内的人数是相同的; ...

  5. POJ 1035-Spell checker(字符串)

    题目地址:POJ 1035 题意:输入一部字典.输入若干单词. 若某个单词能在字典中找到,则输出corret.若某个单词能通过 变换 或 删除 或 加入一个字符后.在字典中找得到.则输出这些单词.输出 ...

  6. C++对象模型——效率有了,弹性呢(第七章)

    7.4    效率有了,弹性呢 传统的C++对象模型提供有效率的运行期支持.这份效率,再加上与C之间的兼容性,造成了C++的广泛被接受度.然而,在某些领域方面,像是动态共享函数库(dynamicall ...

  7. 轻松python专题--文本

    基础篇:(取材于零基础学python) 7.1 python中的字符串简单介绍与经常使用函数 7.2 字符串常量 7.3 字符串的一般使用 7.4 改动字符串实例 7.5 文本解析 7.6 字符串格式 ...

  8. vue9 计算属性 computed

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. USACO2011 Jan:公司利润

    简要题意: 奶牛开了家公司,已经连续运作了N 天.它们在第i 天获得了Ai元的利润,不过有些天是亏钱的,这种情况下利润就是一个负数.约翰想为它们写个新闻,吹嘘它们的惊人业绩.请你帮助他选出一段连续的日 ...

  10. C++中友元类使用场合

    在C++中我们可以將函数定义成类的友元函数,这样在函数中就可以访问类的私有成员.与函数相同,类也可以作为另一个类的友元类,在友元类中可以访问另外一个类的所有成员. 声明友元类的方法很简单,只需在类中写 ...