网络

一,网络协议篇

网络通信三要素:主机号,端口号,传输协议(通过ip找服务器,通过端口找进程,通过传输协议确定如何传输数据)
ip地址和端口号
1,TCP/IP协议:传输控制协议(传输层协议),它可以提供可靠的、面向连接的网络数据传递服务。主要解决数据如何在网络中传输,而应用层的HTTP协议,主要解决如何包装数据。HTTP是建立在TCP基础上的,HTTP每次请求完成,就会把TCP断开,所以是短链接

TCP三次握手建立连接
第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进 入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 连接状态,完成三次握手,客户端与服务器开始传送数据.
TCP四次挥手断开连接
( 1 )客户端 A 发送一个 FIN ,用来关闭客户 A 到服务器 B 的数据传送。 
( 2 )服务器 B 收到这个 FIN ,它返回一个 ACK ,确认序号为收到的序号加 1 。和 SYN 一样,一个FIN 将占用一个序号。 
( 3 )服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A 。 
( 4 )客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1 ,客服端关闭与服务器的连接。
在信息交互过程中,我们假设:
你的电脑ip是 111.111.111.111 qq进程端口号是8888
qq服务器的IP是 222.222.222.222  服务器qq应用的端口号是9999
那么操作系统会把你发送的数据(JSON)和ip地址以及端口号打包成一个特定的格式(TCP)报文,然后转为2进制数据,最后变为正弦的模拟信号,由计算机网卡发出,到路由器,再到因特网;
QQ服务器收到消息后,会进行反解包,即可得到上面的数据了。
当qq服务器收到数据后,会隐藏的发送一个接收确认帧(这个确认帧是TCP规定的,不是腾讯为了安全起见而特意写的),你的计算机收到确认帧,代表本次消息发送成功,未收到确认帧说明发送失败。

2,UDP(传输层的协议)

UDP全称是User Datagram Protocol,中文名为数据报文协议,是基于广播的协议。UDP 提供无连接的网络服务,该服务对消息中传输的数据提供不可靠的、最大努力传送。这意味着它不保证数据报的到达,也不保证所传送数据包的顺序是否正确。

3,HTTP协议:超文本传输协议,规定了客户端和服务器之间的数据传输格式.

请求包含:请求行,请求头,请求体

请求行

包含请求方法(Method)、请求统一资源标识符(URI)、HTTP版本号

请求头:

HTTP请求在iOS中用NSURLRequest与NSMutableRequest表示;HTTP响应用NSHTTPURLResponse表示。

  • Host: 目标服务器的网络地址
  • Accept: 让服务端知道客户端所能接收的数据类型,如text/html /
  • Content-Type: body中的数据类型,如application/json; charset=UTF-8
  • Accept-Language: 客户端的语言环境,如zh-cn
  • Accept-Encoding: 客户端支持的数据压缩格式,如gzip
  • User-Agent: 客户端的软件环境,我们可以更改该字段为自己客户端的名字,比如QQ music v1.11,比如浏览器Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Maxthon/4.5.2
  • Connection: keep-alive,该字段是从HTTP 1.1才开始有的,用来告诉服务端这是一个持久连接,“请服务端不要在发出响应后立即断开TCP连接”。关于该字段的更多解释将在后面的HTTP版本简介中展开。
  • Content-Length: body的长度,如果body为空则该字段值为0。该字段一般在POST请求中才会有。
    POST请求的body请求体也有可能是空的,因此POST中Content-Length也有可能为0
  • Cookie: 记录者用户信息的保存在本地的用户数据,如果有会被自动附上
    值得一提的是,在iOS中当你发送一个任意请求时,不管你愿不愿意,NSURLRequest都会自动帮你记录你所访问的URL上设置的cookie。在iOS中用NSHTTPCookieStorage表示,是一个单例。通过
    NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *cookie in [cookieJar cookies]) {
    NSLog(@"%@", cookie);
    }
    可以获取目前被自动保存的所有cookie。对cookie的操作感兴趣的请移步iOS中http请求使用cookie这篇文章。
请求体

真正需要发给服务端的数据,在使用POST-multipart上传请求中请求体就是上传文件的二进制NSData类型数据;在GET请求中请求体为空;在普通的POST请求中请求体就是一些表单数据。在iOS中一般用NSURLRequest与NSMutableURLRequest的HTTPBody属性表示,添加body用-[NSMutableURLRequest setHTTPBody:]。

响应:状态行、响应头、实体内容

响应状态行

状态行是服务端返回给客户端的状态信息,包含HTTP版本号、状态码、状态码对应的英文名称。
以下就是典型的正确状态行:
HTTP/1.1 200 OK
这个部分需要讲的是错误码。事实上HTTP请求错误码可以根据错误码从左往右第一个数字大致分为以下几类:
1XX:信息提示。不代表成功或者失败,表示临时响应,比如100表示继续,101表示切换协议
2XX: 成功
3XX: 重定向
4XX:客户端错误,很有可能是客户端发生问题,如亲切可爱的404表示未找到文件,说明你的URI是有问题的,服务器机子上该目录是没有该文件的;414URI太长
5XX: 服务器错误,比如504网关超时

HTTP与HTTPS的区别
1.两者主要差别在于会话的连接建立阶段.
2.在TCP连接建立好,HTTP请求发送前( 加入建立一个SSL会话 ),用于C端与S端协商使用何种密码,交换公钥,验证协商以及验证身份(可选).
3.当SSL会话建立完毕后,在TCP连接之上传输的所有数据都是加密的.

4,socket(即时通讯)

socket是对TCP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。TCP和UDP只是一个协议,一个规定。而Socket就是一个遵循这个协议的执行者。
每一个终端都可以通过Socket实现TCP和UDP的信息交互。
比如ios端实现了TCP协议的类叫做CFSocket和CFStream
安卓端实现TCP协议的类叫做JSocket。
虽然这是两个不同语言的不同类。但是他们都遵循了TCP协议。所以他们可以在不同类型的操作系统上,实现信息交互,从而实现ios和安卓的信息交互。

你可能感兴趣的:(网络)