www.jianshu.com/p/1389677a5840
www.cnblogs.com/meier1205/p/5971313.html
blog.csdn.net/hopedark/article/details/50729763
我相信出去面试的同学经常会被问到网络层相关的问题,其实作为一个ios开发,可能接触这一块比较少,但是如果想表现自己是一位老程序员,这方面的知识是不可少的.首先上一张图给大家看看网络请求过程.
七层模型介绍(OSI 模型(Open System Interconnection model))
1.物理层: 物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输;eg:RJ45等将数据转化成0和1;
2.数据链路层: 数据链路层通过物理网络链路提供数据传输。不同的数据链路层定义了不同的网络和协 议特征,其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控可以简单的理解为:规定了0和1的分包形式,确定了网络数据包的形式;
数据链路层:SLIP,CSLIP,PPP,MTU
3.网络层: 网络层负责在源和终点之间建立连接可以理解为,此处需要确定计算机的位置,怎么确定?IPv4,IPv6!
网络层:IP,ICMP,OSPF,EIGRP,IGMP
IP 协议: 是网络互连协议(Internet Protocol)的缩写。它提供了能适应各种网络硬件的灵活性,对底层网络硬件几乎没任何要求,任何一个网络只要能够从一个地点向另一个地点传送二进制数据,即可使用IP协议加入互联网络了
4.传输层: 传输层向高层提提供可靠的端到端的网络数据流服务,可以理解为:每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP)协议;
传输层:TCP,UDP
说说关于UDP/TCP的区别?
UDP: 是用户数据报协议: 主要用在实时性要求高以及对质量相对较弱的地方,但面对现在高质量的线路不是容易丢包除非是一些拥塞条件下, 如流媒体
TCP: 是传输控制协议:是面连接的,那么运行环境必然要求其可靠性不可丢包有良好的拥塞控制机制如http ftp telnet 等
什么是三次握手与四次挥手?
三次握手实现的过程:
第一次握手:建立连接时,客户端发送同步序列编号到服务器,并进入发送状态,等待服务器确认
第二次:服务器收到同步序列编号,确认并同时自己也发送一个同步序列编号+确认标志,此时服务器进入接收状态
第三次:客户端收到服务器发送的包,并向服务器发送确认标志,随后链接成功。
注意:是在链接成功后在进行数据传输。
四次挥手:
第一次: 客户端向服务器发送一个带有结束标记的报文。
第二次:服务器收到报文后,向客户端发送一个确认序号,同时通知自己相应的应用程序:对方要求关闭连接
第三次: 服务器向客户端发送一个带有结束标记的报文。
第四次: 客户端收到报文后,向服务器发送一个确认序号。链接关闭。
5.会话层: 会话层建立、管理和终止表示层与实体之间的通信会话;建立一个连接(自动的手机信息、自动的网络寻址)
6.表示层: 表示层提供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息 可以被另一个系统应用层识别可以理解为:解决不同系统之间的通信,eg:Linux下的QQ和Windows下的QQ可以通信;
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
一、HTTP 协议:是超文本传输协议,对应于应用层,用于如何封装数据,http 为短连接:客户端发送请求都需要服务器端回送响应.请求结束后,主动释放链接,因此为短连接。通常的做法是,不需要任何数据,也要保持每隔一段时间向服务器发送"保持连接"的请求。这样可以保证客户端在服务器端是"上线"状态,HTTP连接使用的是"请求-响应"方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据。
二、FTP 协议 :是文件传输协议,是File Transfer Protocol的简称,它的作用是用于控制互联网上文件的双向传输,因此一定不会是即时聊天使用的;UDP是面向无连接的传输层协议,数据传输是不可靠的,它只管发,不管收不收得到;TCP是面向连接的,可靠的传输层协议;HTTP是超文本传输协议,对应于应用层,而HTTP是基于TCP的。
超文本传输协议,访问的是远程的网络资源,格式是http://
不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议,访问百度主页:http://www.baidu.com,获得新浪的微博数据,获得大众点评的团购数据.
HTTP的全称是Hypertext Transfer Protocol,超文本传输协议
(1)规定客户端和服务器之间的数据传输格式
(2)让客户端和服务器能有效地进行数据沟通
要想使用HTTP协议向服务器索取数据,得先了解HTTP通信的完整过程
完整的http通信可以分为2大步骤
(1)请求:客户端向服务器索要数据
(2)响应:服务器返回客户端相应的数据
HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
请求行 :包含了请求方法、请求资源路径、HTTP协议版本
GET /MJServer/resources/images/1.jpg HTTP/1.1
请求头: 包含了对客户端的环境描述、客户端请求的主机地址等信息
Host: 192.168.1.105:8080// 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0 (MacintoshIntel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境
Accept: text/html, */*// 客户端所能接收的数据类型
Accept-Language: zh-cn// 客户端的语言环境
Accept-Encoding: gzip// 客户端支持的数据压缩格式
请求体 :客户端发给服务器的具体数据,比如文件数据
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
HTTP协议规定:1个完整的HTTP响应中包含以下内容:
状态行: 包含了HTTP协议版本、状态码、状态英文名称
HTTP/1.1 200 OK
响应头: 包含了对服务器的描述、对返回数据的描述
Server: Apache-Coyote/1.1// 服务器的类型
Content-Type: image/jpeg// 返回数据的类型
Content-Length: 56811// 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT// 响应的时间
实体内容: 服务器返回给客户端的具体数据,比如文件数据
在HTTP/1.1协议中,定义了8种发送http请求的方法
GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
PUT :增
DELETE :删
POST:改
GET:查
提示:最常用的是GET和POST(实际上GET和POST都能办到增删改查)
要想使用GET和POST请求跟服务器进行交互,得先了解一个概念:参数就是传递给服务器的具体数据,比如登录时的帐号、密码
GET和POST对比:GET和POST的主要区别表现在数据传递上
GET
在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如 http://ww.test.com/login?username=123&pwd=234&type=JSON
注意:由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
POST
发给服务器的参数全部放在请求体中
理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)
选择GET和POST的建议
(1)如果要传递大量数据,比如文件上传,只能用POST请求
(2)GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST
(3)如果仅仅是索取数据(数据查询),建议使用GET
(4)如果是增加、修改、删除数据,建议使用POST.
要想明白 Socket,必须要理解 TCP 连接。
TCP 三次握手:握手过程中并不传输数据,在握手后服务器与客户端才开始传输数据,理想状态下,TCP 连接一旦建立,在通讯双方中的任何一方主动断开连接之前 TCP 连接会一直保持下去。
Socket 是对 TCP/IP 协议的封装,Socket 只是个接口不是协议,通过 Socket 我们才能使用 TCP/IP 协议,除了 TCP,也可以使用 UDP 协议来传递数据。
创建 Socket 连接的时候,可以指定传输层协议,可以是 TCP 或者 UDP,当用 TCP 连接,该Socket就是个TCP连接,反之。
Socket 原理
Socket 连接,至少需要一对套接字,分为 clientSocket,serverSocket 连接分为3个步骤:
(1) 服务器监听:服务器并不定位具体客户端的套接字,而是时刻处于监听状态;
(2) 客户端请求:客户端的套接字要描述它要连接的服务器的套接字,提供地址和端口号,然后向服务器套接字提出连接请求;
(3) 连接确认:当服务器套接字收到客户端套接字发来的请求后,就响应客户端套接字的请求,并建立一个新的线程,把服务器端的套接字的描述发给客户端。一旦客户端确认了此描述,就正式建立连接。而服务器套接字继续处于监听状态,继续接收其他客户端套接字的连接请求.
Socket为长连接: 通常情况下Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通讯双方开始互发数据内容,直到双方断开连接。在实际应用中,由于网络节点过多,在传输过程中,会被节点断开连接,因此要通过轮询高速网络,该节点处于活跃状态。
很多情况下,都是需要服务器端向客户端主动推送数据,保持客户端与服务端的实时同步。
若双方是 Socket 连接,可以由服务器直接向客户端发送数据。
若双方是 HTTP 连接,则服务器需要等客户端发送请求后,才能将数据回传给客户端。
因此,客户端定时向服务器端发送请求,不仅可以保持在线,同时也询问服务器是否有新数据,如果有就将数据传给客户端。
你的问题把我搞惨了,我也遇到过。解决办法如下:“在建立与服务器的连接时出错。在连接到 SQLServer 2005 时,在默认的设置下 SQL Server不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序,error: 40 - 无法打开到 SQL Server 的连接)”
我太恨这句话了。本以为会很简单的数据库连接,居然困扰了我好几天。问了身边很多人、查了大量资料无果,今天终于在网上找到正确的答案并顺利解决了。究其根本,原因出在server参数设置的问题上。
以下是完整的解决方案:
1:最重要,servers服务开启。
1.安装一个SQLServer的管理工具(VS2005只有配置工具),据说微软的官方网站有下。
2.开启sql2005远程连接功能,开启办法如下:
配置工具->sqlserver外围应用配置器->服务和连接的外围应用配置器->打开MSSQLSERVER节点下的DatabaseEngine 节点,选择"远程连接",接下建议选择"同时使用TCP/IP和namedpipes",确定后,重启数据库服务就可以了.
3.登陆设置改为,Sql server and windowsAuthentication方式同时选中,具体设置如下:
manage管理器->windowsAuthentication(第一次用windows方式进去),->对象资源管理器中选择你的数据服务器--右键>属性>security>Sqlserver and windows Authentication方式同时选中.
4:设置一个Sql server方式的用户名和密码,具体设置如下:
进入manage管理器后,找到服务器下的Security->Logins->sa,右键属性,设置密码为sa(当然也可以设置其他用户名和密码)这样就设置了一个用户名为sa,密码为sa的用户,下次在登陆时,可以用Sql server方式,用户名为sa,密码为:sa的用户进数据库了。
5: 做完上面四步后,这样写连接字符串就可以顺利进入数据库了,
(server=.\\sqlexpressuid=sapwd=sadatabase=master")
注意!正确的Server名是这样的,机器名\SQLEXPRESS而不是LOCALHOST,127.0.0.1,MJZG(机器名)比如我的是这样的Server:TDS\SQLEXPRESS
iOS开发网络篇—GET请求和POST请求一、GET请求和POST请求简单说明
创建GET请求
1 //1.设置请求路径
2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]
3 NSURL *url=[NSURL URLWithString:urlStr]
4
5 //2.创建请求对象
6 NSURLRequest *request=[NSURLRequest requestWithURL:url]
7
8 //3.发送请求
服务器:
创建POST请求
1 // 1.设置请求路径
2 NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"]//不需要传递参数
3
4 //2.创建请求对象
5 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL]//默认为get请求
6 request.timeoutInterval=5.0//设置请求超时为5秒
7 request.HTTPMethod=@"POST"//设置请求方法
8
9 //设置请求体
10 NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text]
11 //把拼接后的字符串转换为data,设置请求体
12 request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding]
13
14 //3.发送请求
服务器:
二、比较
建议:提交用户的隐私数据一定要使用POST请求
相对POST请求而言,GET请求的所有参数都直接暴露在URL中,请求的URL一般会记录在服务器的访问日志中,而服务器的访问日志是黑客攻击的重点对象之一
用户的隐私数据如登录密码,银行账号等。
三、使用
1.通过请求头告诉服务器,客户端的类型(可以通过修改,欺骗服务器)
1 // 1.设置请求路径
2 NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"]//不需要传递参数
3
4 //2.创建请求对象
5 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL]//默认为get请求
6 request.timeoutInterval=5.0//设置请求超时为5秒
7 request.HTTPMethod=@"POST"//设置请求方法
8
9 //设置请求体
10 NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text]
11 //把拼接后的字符串转换为data,设置请求体
12 request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding]
13
14 //客户端类型,只能写英文
15 [request setValue:@"ios+android" forHTTPHeaderField:@"User-Agent"]
服务器:
2.加强对中文的处理
问题:URL不允许写中文
在GET请求中,相关代码段打断点以验证。
在字符串的拼接参数中,用户名使用“文顶顶”.
转换成URL之后整个变成了空值。
提示:URL里面不能包含中文。
解决:进行转码
1 //1.设置请求路径
2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]
3//转码
4urlStr= [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
5 NSURL *url=[NSURL URLWithString:urlStr]
6
7 //2.创建请求对象
8 NSURLRequest *request=[NSURLRequest requestWithURL:url]
调试查看:
服务器:
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)