网络层的详解

网络层的详解,第1张

www.cnblogs.com/wendingding/p/3813466.html

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]

调试查看:

服务器:


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/396210.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存