传输层中的协议html
传输层它为应用层提供会话和数据报通讯fu务。数据库
传输层承担OSI传输层的职责。apache
传输层的核心协议是TCP和UDP。swift
TCP提供一对一的、面向链接的可靠通讯fu务。TCP创建链接,对发送的数据包进行排序和确认,并恢复在传输过程当中丢失的数据包。与TCP不一样,UDP提供一对一或一对多的、无链接的不可靠通讯fu务。浏览器
不管是TCP/IP仍是在OSI参考模型中,任意相邻两层的下层为fu务提供者,上层为fu务调用者。下层为上层提供的fu务可分为两类:面向链接fu务和无链接fu务。缓存
面向链接的网络fu务安全
面向链接的网络fu务又称为虚电路(Virtual Circuit)fu务,它具备网络链接创建、数据传输和网络链接释放三个阶段。是按顺序传输可靠的报文分组方式,适用于指定对象、长报文、会话型传输要求。网络
面向链接fu务以phone系统为模式。要和某我的通话,首先拿起phone,拨号码,通话,而后挂断。一样在使用面向链接的fu务时,用户首先要创建链接,使用链接,而后释放链接。链接本质上像个管道:发送者在管道的一端放入物体,接收者在另外一端按一样的次序取出物体;其特色是收发的数据不只顺序一致,并且内容也相同。--相似打phoneapp
无链接的网络fu务框架
无链接网络fu务的两实体之间的通讯不须要事先创建好一个链接。无链接网络fu务有3种类型:数据报(Datagram)、确认交付(Confirmed Delivery)与请求回答(Request reply)。
无链接fu务以邮政系统为模式。每一个报文(信件)带有完整的目的地址,而且每个报文都独立于其余报文,由系统选定的路线传递。在正常状况下,当两个报文发往同一目的地时,先发的先到。可是,也有可能先发的报文在途中延误了,后发的报文反而先收到;而这种状况在面向链接的fu务中是绝对不可能发生的。--相似发短信
传输控制协议(TCP)
1.TCP全称是Transmission Control Protocol,中文名为传输控制协议,它能够提供可靠的、面向链接的网络数据传递fu务。传输控制协议主要包含下列任务和功能:
2.确保IP数据报的成功传递。
对程序发送的大块数据进行分段和重组。
确保正确排序及按顺序传递分段的数据。
经过计算校验和,进行传输数据的完整性检查。
根据数据是否接收成功发送确定消息。经过使用选择性确认,也对没有收到的数据发送否认确认。
为必须使用可靠的、基于会话的数据传输程序,如ke户端/fu务器数据库和电子邮件程序,提供首选传输方法。
3.TCP工做原理
TCP的链接创建过程又称为TCP三次握手:
首先发送方主机向接收方主机发起一个创建链接的同步(SYN)请求;
接收方主机在收到这个请求后向发送方主机回复一个同步/确认(SYN/ACK)应答;
发送方主机收到此包后再向接收方主机发送一个确认(ACK),此时TCP链接成功创建.
一旦初始的三次握手完成,在发送和接收主机之间将按顺序发送和确认段。关闭链接以前,TCP使用相似的握手过程验证两个主机是否都完成发送和接收所有数据。
完成三次握手,ke户端与fu务器开始传送数据。
三次握手示意图:
三次握手.png
TCP工做过程比较复杂,包括的内容以下。
TCP链接关闭:发送方主机和目的主机创建TCP链接并完成数据传输后,会发送一个将结束标记置1的数据包,以关闭这个TCP链接,并同时释放该链接占用的缓冲区空间。
TCP重置:TCP容许在传输的过程当中忽然中断链接。
TCP数据排序和确认*:在传输的过程当中使用序列号和确认号来跟踪数据的接收状况。
TCP重传:在TCP的传输过程当中,若是在重传超时时间内没有收到接收方主机对某数据包的确认回复,发送方主机就认为此数据包丢失,并再次发送这个数据包给接收方。
TCP延迟确认:TCP并不老是在接收到数据后当即对其进行确认,它容许主机在接收数据的同时发送本身的确认信息给对方。
TCP数据保护(校验):TCP是可靠传输的协议,它提供校验和计算来实现数据在传输过程当中的完整性。
用户数据报协议(UDP)
UDP全称是User Datagram Protocol,中文名为用户数据报协议。UDP 提供无链接的网络fu务,该fu务对消息中传输的数据提供不可靠的、最大努力传送。这意味着它不保证数据报的到达,也不保证所传送数据包的顺序是否正确。
我最初就有一个疑惑:“既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?”
在有些状况下UDP可能会变得很是有用。由于UDP具备TCP所可望不可即的速度优点。虽然TCP中植入了各类安全保障功能,可是在实际执行的过程当中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP因为排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大地下降了执行时间,使速度获得了保证。
TCP与端口号
TCP和UDP都是IP层面的传输协议,是IP与上层之间的处理接口。TCP和UDP端口号被设计来区分运行在单个设备上的多重应用程序的IP地址。因为同一台计算机上可能会运行多个网络应用程序,因此计算机须要确保目标计算机上接收源主机数据包的软件应用程序的正确性,以及响应可以被发送到源主机的正确应用程序上。该过程正是经过使用TCP或UDP端口号来实现的。
--即每个应用都会在网卡上注册一个端口号用来区分同一台设备上应用的之间的通讯
在TCP和UDP头部分,有“源端口”和“目标端口”段,主要用于显示发送和接收过程当中的身份识别信息。IP 地址和端口号合在一块儿被称为“套接字”。TCP端口比较复杂,其工做方式与UDP端口不一样。UDP端口对于基于UDP的通讯做为单一消息队列和网络端点来操做,而全部TCP通讯的终点都是惟一的链接。每一个TCP链接由两个端点惟一识别。因为全部TCP链接由两对 IP 地址和TCP端口惟一识别(每一个所连主机都有一个地址/端口对),所以每一个TCPfu务器端口都能提供对多个链接的共享访问
再看一下IP数据包和TCP/UDP的数据包
数据包.png
HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为普遍的一种网络协议。
http协议规定了ke户端和fu务器之间的数据传输格式.
http优势:
简单快速:http协议简单,通讯速度很快;
灵活:http协议容许传输任意类型的数据;
短链接:http协议限制每次链接只处理一个请求,fu务器对ke户端的请求做出响应后,立刻断开链接.这种方式能够节省传输时间.
HTTP协议的使用
1.请求:ke户端向fu务器索要数据.
http协议规定:一个完整的http请求包含'请求行','请求头','请求体'三个部分;
请求行:包含了请求方法,请求资源路径,http协议版本. "GET /resources/images/ HTTP/1.1"
请求头:包含了对ke户端的环境描述,ke户端请求的主机地址等信息.
Accept: text/html ( ke户端所能接收的数据类型 )
Accept-Language: zh-cn ( ke户端的语言环境 )
Accept-Encoding: gzip( ke户端支持的数据压缩格式 )
Host: m.baidu.com( ke户端想访问的fu务器主机地址 ) User-Agent: Mozilla/5.0(Macintosh;Intel Mac OS X10.10 rv:37.0) Gecko/20100101Firefox/37.0( ke户端的类型,ke户端的软件环境 )
请求体:ke户端发给fu务器的具体数据,好比文件/图片等.
2.响应:fu务器返回ke户端想要的数据
http协议规定:一个完整的http响应包含'状态行','响应头','实体内容'三个部分;
状态行:包含了http协议版本,状态吗,状态英文名称.
"HTTP/1.1 200 OK"
响应头:包含了对fu务器的描述,对返回数据的描述.
Content-Encoding: gzip(fu务器支持的数据压缩格式) Content-Length: 1528(返回数据的长度)
Content-Type:application/xhtml+xml;charset=utf-8(返回数据的类型)
Date: Mon,15Jun201509:06:46GMT(响应的时间) Server: apache (fu务器类型)
实体内容:fu务器返回给ke户端的具体数据(图片/html/文件...).
3.发送http请求
在iOS开发中,发送http请求的方案有不少,常见的有以下几种:
苹果原生:
1.NSURLConnection:用法简单,古老经典的一种方案.
2.NSURLSession:iOS7之后推出的技术,功能NSURLConnection更增强大.
3.CFNetWork:NSURL的底层,纯C语言,通常不用.
第三方框架:
AFNetWorking(OC);Alamofire(swift);
HTTP方法
http协议定义了不少方法对应不一样的资源操做,其中最经常使用的是GET和POST方法。
eg:GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
增:PUT
删:DELETE
改:POST
查:GET
由于GET和POST能够实现上述全部操做,因此,在现实开发中,GET和POST方法使用的最为普遍,除此之外HEAD请求使用频率也比较高;
GET
在请求URL后面以?的形式跟上发给fu务器的参数,参数以"参数名"="参数值"的形式拼接,多个参数之间用&分隔;
GET的本质是从fu务器获得数据,效率更高.而且GET请求能够被缓存.
注意:GET的长度是有限制的,不一样的浏览器有不一样的长度限制,通常在2~8K之间;
POST
POST的本质是向fu务器发送数据,也能够得到fu务器处理以后的结果,效率不如GET.POST请求不能够被缓存,每次刷新以后都须要从新提交表单.
发送给fu务器的参数所有放在'请求体'中;
理论上,POST传递的数据量没有限制.
注意:全部涉及到用户隐私的数据(密码/银行卡号等...)都要用POST的方式传递.
HEAD
HEAD方法一般用在下载文件以前,获取远程fu务器的文件信息!相比于GET请求,不会下载文件数据,只得到响应头信息!
通常,使用HEAD方法的目的是提早告诉用户下载文件的信息,由用户肯定是否下载文件!因此, HEAD方法,最好发送同步请求!
响应消息
1xx:信息响应类,表示接收到请求而且继续处理
2xx:处理成功响应类,表示动做被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动做,必须接受进一步处理
4xx:ke户端错误,ke户请求包含语法错误或者是不能正确执行
5xx:fu务端错误,fu务器不能正确执行一个正确的请求;
详细描述:状态码