欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络

程序员文章站 2022-04-29 16:37:25
...

一,网络协议篇

网络通信三要素:主机号,端口号,传输协议(通过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和安卓的信息交互。