计算机网络
对于程序员来讲,对计算机网络的了解是必要的。特别是基于IP和TCP/IP的网络以及Internet。此篇文章将向各位介绍关于计算机网络的相关基本知识
网络的定义
网络是用线缆链接,数据位转换为通过线缆移动的电磁波
。对于无线网络则是通过红外光和微波传输数据。
网络中的节点(node)
当你将你的计算机连接到计算机网络中,我们就将此计算机称为节点
。虽然大多数节点都是计算机,但是像打印机、路由器、网桥、网关等终端也是节点,只要它们连接到计算机网络中。
我们将每个连入计算机网络的设备称作节点,对于每个节点来讲,计算机网络都会分配唯一的地址,这个地址是用于标识节点的一连串字节。事实上,我们两台连入计算机网络中的设备,要想通信,必须要知道对方的节点地址
。
对于节点地址
,事实上是一组数字。例如:192.168.1.1
,这组数字就像人的身份证号码一样,可以唯一标识一个节点。
然而对于一连串数字并不方便记忆,于是节点还有可以帮助人们方便记忆的名称。比如:www.baidu.com
。对于计算机节点来讲,一个名称指一个地址,但是名称并不锁定一个地址,如果你拥有多个节点地址,你可以让它都叫这个名称。
对于节点名称
,我们更多叫它域名。(域名需要购买和备案的)
计算机在计算机网络中通信
计算机在网络中是通过 包
进行通信的。流经网络的数据被分割成很多个小块,我们将这些小块称为 包(packet)
。在通信中,我们将每个包
都单独加以处理,使包
中都包含 由谁发送
和将发往何处
等的信息。
那么我们如何来处理每个包
呢?为了解决这个问题,我们就定义了一些协议
,协议定义了计算机如何通信的一组明确的规则:包括地址格式、数据如何分包等
。
针对网络通信的不同方面,大家定义了很多不同的协议
。例如超文本传输协议HTTP
,定义了web浏览器如何与服务器通信。
在计算机网络中常用的协议有哪些?
协议 | 端口 | 基础协议 | 用途 |
---|---|---|---|
HTTP/HTTPS | 80 | TCP | 国际互联网的支持协议 |
file | TCP | 本地文件协议 | |
FTP | 21 | TCP | 文件传输协议 |
SSH | 22 | TCP | 用于加密和远程登录 |
SMTP | 25 | TCP | 邮件协议 |
talnet | 23 | TCP | 用于交互式远程登录会话 |
网络协议的基础-TCP/IP
TCP/IP协议是网络的基础,是Internet的语言,可以说没有TCP/IP协议就没有互联网的今天。
TCP/IP是“transmission Control Protocol/Internet Protocol”的简写,中文译名为传输控制协议/互联网络协议)协议, TCP/IP(传输控制协议/网间协议)是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式以及传送方式。TCP/IP是INTERNET的基础协议,也是一种电脑数据打包和寻址的标准方法。在数据传送中,可以形象地理解为有两个信封,TCP和IP就像是信封,要传递的信息被划分成若干段,每一段塞入一个TCP信封,并在该信封面上记录有分段号的信息,再将TCP信封塞入IP大信封,发送上网。在接受端,一个TCP软件包收集信封,抽出数据,按发送前的顺序还原,并加以校验,若发现差错,TCP将会要求重发。因此,TCP/IP在INTERNET中几乎可以无差错地传送数据。 对普通用户来说,并不需要了解网络协议的整个结构,仅需了解IP的地址格式,即可与世界各地进行网络通信
关于TCP/IP的基础理论比较多,在此给大家推荐一个博客
URL
URL用于标识Internet上资源位置。它指定用于访问服务器的协议、服务器名称以及文件在服务器上面的位置。如:http://iosseventeenclass.sinaapp.com/myapp/index.php
语法:
protocol://username@hostname:port/path/filename?query#fragment
protocol
代表网路协议,可以http、FTP、file等协议username
代表服务器用户名,可选参数hostname
代表服务器名称,可以是名称,也可以是节点地址
port
代表端口号,可选参数,如果是http协议,会是默认80端口,如果是FTP协议默认是21端口path/filename
代表文件在服务器路径query#fragment
代表查询条件,通常用于向服务器提供附加参数,一般只用于http URL,这里的查询条件是向服务器程序提供的参数。
note:
在URL中不可出现中文、空格、百分号等一些特殊字符。因此我们需要对此URL进行编码
为什么要对url进行编码?
我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。
针对“name1=value1&name2=value2”我们来说一下客户端到服务端的概念上解析过程:
上述字符串在计算机中用ASCII吗表示为:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。
6E616D6531:name1
3D:=
76616C756531:value1
26:&
6E616D6532:name2
3D:=
76616C756532:value2
服务端在接收到该数据后就可以遍历该字节流,首先一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再想后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。
现在有这样一个问题,如果我的参数值中就包含=或&这种特殊字符的时候该怎么办。
比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输 过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服 务端会解析成两个键值对,这样就产生了奇异。
如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码
URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的 字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的 字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。
GET和POST
在iOS开发中,我们的客户端即iPhone和服务器端数据交互常用的方式有两种,GET请求和POST请求。当然还有一些请求方式,如 PUT 、 DELETE等。此节课主要是给大家讲解GET和POST请求
1.GET请求
GET请求是客户端向服务器端请求资源
2.POST请求
POST请求是客户端向服务器端上传资源
note:
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
GET和POST请求的报文格式
我们这里讲到的GET
和POST
请求是基于HTTP
协议之下,在HTTP
协议下,对于GET
和POST
请求,它们都有规定的请求格式。
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
1.请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
(1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息。
典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
(3)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
(5)请求示例
POST:
POST报文头如下:
POST /sn/index.php HTTP/1.1
Accept: */*
Accept-Language: zh-cn
host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection:close
sn=123&n=asa
在http头后边有一空行,空行后边接着发送post数据,长度通过Content-Length: 12指出,
此post数据中包含两项:
sn=123
n=asa
其中:
Content-Type: application/x-www-form-urlencoded 指定POST数据的编码类型
Content-Length: 12 POST数据的长度
GET:
GET报问头如下:
GET /sn/index.php?sn=123&n=asa HTTP/1.1
Accept: */*
Accept-Language: zh-cn
host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection:close