1.
什么是网络编程
1.网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备 中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请 求/
响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。在网络 编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client)
,等待其他程序连 接的程序被称作服务器(Server)
。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应 连接,则需要一直启动。
2.例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。 连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。在一 些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是QQ
、微信这类软件了。
2.网络编程中两个主要的问题
1.
一个是如何准确的定位网络上一台或多台主机,
2.
另一个就是找到主机后如何可靠高效的进行数据传输。
在
TCP/IP
协议中
IP
层主要负责网络主机的定位,数据传输的路由,由
IP
地址可以唯一地确定
Internet
上的一台主机。
而
TCP
层则提供面向应用的可靠(
TCP
)的或非可靠(
UDP
)的数据传输机制,这是网络编程的主
要对象,一般不需要关心
IP
层是如何处理数据的。
目前较为流行的网络编程模型是客户机
/
服务器(
C/S
)结构。即通信双方一方作为服务器等待客户
提出请求并予以响应。客户则在需要服务时向服务器提 出申请。服务器一般作为守护进程始终运
行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服
务端口,使后来的客户也 能及时得到服务。
3.网络协议是什么
在计算机网络要做到井井有条的交换数据,就必须遵守一些事先约定好的规则,比如交换数据的格
式、是否需要发送一个应答信息。这些规则被称为网络协议。
为什么要对网络协议分层
简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。
灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受影响。
易于实现和维护。
促进标准化工作。分开后,每层功能可以相对简单地被描述
计算机网络体系结构
OSI
参考模型
OSI
(
Open System Interconnect
),即开放式系统互联。一般都叫
OSI
参考模型,是
ISO
(国际标准化组织)组织在
1985
年研究的网络互连模型。
ISO
为了更好的使网络应用更为
普及,推出了
OSI
参考模型,这样所有的公司都按照统一的标准来指定自己的网络,就可以互
通互联了。
OSI
定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、
应用层)。
TCP/IP
参考模型
TCP/IP
四层协议(数据链路层、网络层、传输层、应用层)
1.
应用层 应用层最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网
络服务。我们常见应用层的网络服务协议有:
HTTP
,
HTTPS
,
FTP
,
TELNET
等。
2.
传输层 建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数
据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细
节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定
的、可靠的数据通路。我们通常说的,
TCP UDP
就是在这一层。端口号既是这里的
“
端
”
。
3.
网络层 本层通过
IP
寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适
的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的
IP
层。这一
层就是我们经常说的
IP
协议层。
IP
协议是
Internet
的基础。
4.
数据链路层 通过一些规程或协议来控制这些数据的传输,以保证被传输数据的正确性。实现
这些规程或协议的
硬件
和软件加到物理线路,这样就构成了数据链路,
TCP / UDP
1.1
什么是
TCP/IP
和
UDP
TCP/IP
即传输控制
/
网络协议,是面向连接的协议,发送数据前要先建立连接
(
发送方和接收方的成
对的两个之间必须建 立连接
)
,
TCP
提供可靠的服务,也就是说,通过
TCP
连接传输的数据不会丢
失,没有重复,并且按顺序到达
UDP
它是属于
TCP/IP
协议族中的一种。是无连接的协议,发送数据前不需要建立连接,是没有可
靠性的协议。因为不需要建立连接所以可以在在网络上以任何可能的路径传输,因此能否到达目的
地,到达目的地的时间以及内容的正确性都是不能被保证的。
1.2 TCP
与
UDP
区别:
TCP
是面向连接的协议,发送数据前要先建立连接,
TCP
提供可靠的服务,也就是说,通过
TCP
连
接传输的数据不会丢失,没有重复,并且按顺序到达;
UDP
是无连接的协议,发送数据前不需要建立连接,是没有可靠性;
TCP
通信类似于于要打个电话,接通了,确认身份后,才开始进行通行;
UDP
通信类似于学校广播,靠着广播播报直接进行通信。
TCP
只支持点对点通信,
UDP
支持一对一、一对多、多对一、多对多;
TCP
是面向字节流的,
UDP
是面向报文的; 面向字节流是指发送数据时以字节为单位,一个数据
包可以拆分成若干组进行发送,而
UDP
一个报文只能一次发完。
TCP
首部开销(
20
字节)比
UDP
首部开销(
8
字节)要大
UDP
的主机不需要维持复杂的连接状态表
1.3 TCP
和
UDP
的应用场景:
对某些实时性要求比较高的情况使用
UDP
,比如游戏,媒体通信,实时直播,即使出现传输错误
也可以容忍;其它大部分情况下,
HTTP
都是用
TCP
,因为要求传输的内容可靠,不出现丢失的情
况
1.4
形容一下
TCP
和
UDP
TCP
通信可看作打电话:
李三
(
拨了个号码
)
:喂,是王五吗? 王五:哎,您谁啊? 李三:我是李三,我想给你说点事儿,
你现在方便吗? 王五:哦,我现在方便,你说吧。 甲:那我说了啊? 乙:你说吧。
(
连接建立
了,接下来就是说正事了
…)
UDP
通信可看为学校里的广播:
播音室:喂喂喂!全体操场集合
1.5
运行在
TCP
或
UDP
的应用层协议分析。
运行在
TCP
协议上的协议:
HTTP
(
Hypertext Transfer Protocol
,超文本传输协议),主要用于普通浏览。
HTTPS
(
HTTP over SSL
,安全超文本传输协议)
,HTTP
协议的安全版本。
FTP
(
File Transfer Protocol
,文件传输协议),用于文件传输。
POP3
(
Post Office Protocol, version 3
,邮局协议),收邮件用。
SMTP
(
Simple Mail Transfer Protocol
,简单邮件传输协议),用来发送电子邮件。
TELNET
(
Teletype over the Network
,网络电传),通过一个终端(
terminal
)登陆到网
络。
SSH
(
Secure Shell
,用于替代安全性差的
TELNET
),用于加密安全登陆用。
运行在
UDP
协议上的协议:
BOOTP
(
Boot Protocol
,启动协议),应用于无盘设备。
NTP
(
Network Time Protocol
,网络时间协议),用于网络同步。
DHCP
(
Dynamic Host Configuration Protocol
,动态主机配置协议),动态配置
IP
地址。
运行在
TCP
和
UDP
协议上:
DNS
(
Domain Name Service
,域名服务),用于完成地址查找,邮件转发等工作。
ECHO
(
Echo Protocol
,回绕协议),用于查错及测量应答时间(运行在
TCP
和
UDP
协议
上)。
SNMP
(
Simple Network Management Protocol
,简单网络管理协议),用于网络信息的
收集和网络管理。
DHCP
(
Dynamic Host Configuration Protocol
,动态主机配置协议),动态配置
IP
地址。
ARP
(
Address Resolution Protocol
,地址解析协议),用于动态解析以太网硬件的地址。
什么是
ARP
协议
(Address Resolution Protocol)
?
ARP
协议完成了
IP
地址与物理地址的映射
。每一个主机都设有一个
ARP
高速缓存,里面有
所在的
局域网
上的各主机和路由器的
IP
地址到硬件地址的映射表。当源主机要发送数据包到目的主机
时,会先检查自己的
ARP
高速缓存中有没有目的主机的
MAC
地址,如果有,就直接将数据包发到这
个
MAC
地址,如果没有,就向
所在的局域网
发起一个
ARP
请求的广播包(在发送自己的
ARP
请求
时,同时会带上自己的
IP
地址到硬件地址的映射),收到请求的主机检查自己的
IP
地址和目的主
机的
IP
地址是否一致,如果一致,则先保存源主机的映射到自己的
ARP
缓存,然后给源主机发送一
个
ARP
响应数据包。源主机收到响应数据包之后,先添加目的主机的
IP
地址与
MAC
地址的映射,再
进行数据传送。如果源主机一直没有收到响应,表示
ARP
查询失败。
如果所要找的主机和源主机不在同一个局域网上,那么就要通过
ARP
找到一个位于本局域网上的
某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。
剩下的工作就由下一个网络来做。
什么是
NAT (Network Address Translation,
网络地址转换
)
?
用于解决内网中的主机要和因特网上的主机通信。由
NAT
路由器将主机的本地
IP
地址转换为全球
IP
地址,分为静态转换(转换得到的全球
IP
地址固定不变)和动态
NAT
转换。
从输入址到获得页面的过程
?
1.
浏览器查询
DNS
,获取域名对应的
IP
地址
:
具体过程包括浏览器搜索自身的
DNS
缓存、搜索操作系
统的
DNS
缓存、读取本地的
Host
文件和向本地
DNS
服务器进行查询等。对于向本地
DNS
服务器进
行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析
(
此解析具有权威性
)
;如果要查询的域名不由本地
DNS
服务器区域解析,但该服务器已缓存了此网
址映射关系,则调用这个
IP
地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务
器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
2.
浏览器获得域名对应的
IP
地址以后,浏览器向服务器请求建立链接,发起三次握手;
3. TCP/IP
链接建立起来后,浏览器向服务器发送
HTTP
请求;
4.
服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应
的视图返回给浏览器;
5.
浏览器解析并渲染视图,若遇到对
js
文件、
css
文件及图片等静态资源的引用,则重复上述步骤并
向服务器请求这些资源;
6.
浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
1.6 TCP
的三次握手
1.6.1
什么是
TCP
的三次握手
在网络数据传输中,传输层协议
TCP
是要建立连接的可靠传输,
TCP
建立连接的过程,我们称为三
次握手。
1.6.2
三次握手的具体细节
1.
第一次握手:
Client
将
SYN
置
1
,随机产生一个初始序列号
seq
发送给
Server
,进入
SYN_SENT
状
态;
2.
第二次握手:
Server
收到
Client
的
SYN=1
之后,知道客户端请求建立连接,将自己的
SYN
置
1
,
ACK
置
1
,产生一个
acknowledge number=sequence number+1
,并随机产生一个自己的初始序列
号,发送给客户端;进入
SYN_RCVD
状态;
3.
第三次握手:客户端检查
acknowledge number
是否为序列号
+1
,
ACK
是否为
1
,检查正确之后将
自己的
ACK
置为
1
,产生一个
acknowledge number=
服务器发的序列号
+1
,发送给服务器;进入
ESTABLISHED
状态;服务器检查
ACK
为
1
和
acknowledge number
为序列号
+1
之后,也进入
ESTABLISHED
状态;完成三次握手,连接建立。
简单来说就是 :
1.
客户端向服务端发送
SYN
2.
服务端返回
SYN,ACK
3.
客户端发送
ACK
1.6.3
用现实理解三次握手的具体细节
三次握手的目的是建立可靠的通信信道,主要的目的就是双方确认自己与对方的发送与接收机能正
常。
1.
第一次握手:客户什么都不能确认;服务器确认了对方发送正常
2.
第二次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认 了:自己接
收正常,对方发送正常
3.
第三次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认 了:自己发
送、接收正常,对方发送接收正常 所以三次握手就能确认双发收发功能都正常,缺一不可。
1.6.4
建立连接可以两次握手吗?为什么
?
不可以。
因为可能会出现已失效的连接请求报文段又传到了服务器端。
> client
发出的第一个连接请求报文
段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达
server
。本来这是一个早已失效的报文段。但
server
收到此失效的连接请求报文段后,就误认为
是
client
再次发出的一个新的连接请求。于是就向
client
发出确认报文段,同意建立连接。假设
不采用
“
三次握手
”
,那么只要
server
发出确认,新的连接就建立了。由于现在
client
并没有发出
建立连接的请求,因此不会理睬
server
的确认,也不会向
server
发送数据。但
server
却以为新
的运输连接已经建立,并一直等待
client
发来数据。这样,
server
的很多资源就白白浪费掉了。
采用
“
三次握手
”
的办法可以防止上述现象发生。例如刚才那种情况,
client
不会向
server
的确认
发出确认。
server
由于收不到确认,就知道
client
并没有要求建立连接。
而且,两次握手无法保证
Client
正确接收第二次握手的报文(
Server
无法确认
Client
是否收到),
也无法保证
Client
和
Server
之间成功互换初始序列号。
1.6.5
可以采用四次握手吗?为什么?
这个肯定可以。三次握手都可以保证连接成功了,何况是四次,但是会降低传输的效率。
1.6.6
第三次握手中,如果客户端的
ACK
未送达服务器,会怎样?
Server
端:由于
Server
没有收到
ACK
确认,因此会每隔
3
秒 重发之前的
SYN+ACK
(默认重发五
次,之后自动关闭连接进入
CLOSED
状态),
Client
收到后会重新传
ACK
给
Server
。
Client
端,会出现两种情况:
1.
在
Server
进行超时重发的过程中,如果
Client
向服务器发送数据,数据头部的
ACK
是为
1
的,
所以服务器收到数据之后会读取
ACK number
,进入
establish
状态
2.
在
Server
进入
CLOSED
状态之后,如果
Client
向服务器发送数据,服务器会以
RST
包应答。
1.6.7
如果已经建立了连接,但客户端出现了故障怎么办?
服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为
2
小时,若两小时
还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔
75
秒钟发送一次。若
一连发送
10
个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
1.6.8
初始序列号是什么?
TCP
连接的一方
A
,随机选择一个
32
位的序列号(
Sequence Number
)作为发送数据的初始序列
号(
Initial Sequence Number
,
ISN
),比如为
1000
,以该序列号为原点,对要传送的数据进行
编号:
1001
、
1002...
三次握手时,把这个初始序列号传送给另一方
B
,以便在传输数据时,
B
可以
确认什么样的数据编号是合法的;同时在进行数据传输时,
A
还可以确认
B
收到的每一个字节,如
果
A
收到了
B
的确认编号(
acknowledge number
)是
2001
,就说明编号为
1001-2000
的数据已经
被
B
成功接受。
1.7 TCP
的四次挥手
1.7.1
什么是
TCP
的四次挥手
在网络数据传输中,传输层协议断开连接的过程我们称为四次挥手
1.7.2
四次挥手的具体细节
1.
第一次挥手:
Client
将
FIN
置为
1
,发送一个序列号
seq
给
Server
;进入
FIN_WAIT_1
状态;
2.
第二次挥手:
Server
收到
FIN
之后,发送一个
ACK=1
,
acknowledge number=
收到的序列号
+1
;
进入
CLOSE_WAIT
状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
3.
第三次挥手:
Server
将
FIN
置
1
,发送一个序列号给
Client
;进入
LAST_ACK
状态;
4.
第四次挥手:
Client
收到服务器的
FIN
后,进入
TIME_WAIT
状态;接着将
ACK
置
1
,发送一个
acknowledge number=
序列号
+1
给服务器;服务器收到后,确认
acknowledge number
后,变为
CLOSED
状态,不再向客户端发送数据。客户端等待
2*MSL
(报文段最长寿命)时间后,也进入
CLOSED
状态。完成四次挥手。
1.7.3
用现实理解三次握手的具体细节
TCP
的四次挥手
四次挥手断开连接是因为要确定数据全部传书完了
1.
客户与服务器交谈结束之后,客户要结束此次会话,就会对服务器说:我要关闭连接了(第一 次
挥手)
2.
服务器收到客户的消息后说:好的,你要关闭连接了。(第二次挥手)
3.
然后服务器确定了没有话要和客户说了,服务器就会对客户说,我要关闭连接了。
(
第三次挥 手
)
4.
客户收到服务器要结束连接的消息后说:已收到你要关闭连接的消息。
(
第四次挥手
)
,才关闭
1.7.4
为什么不能把服务器发送的
ACK
和
FIN
合并起来,变成三次挥手(
CLOSE_WAIT
状态意义是什
么)?
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复
ACK
,表示接
收到了断开连接的请求。等到数据发完之后再发
FIN
,断开服务器到客户端的数据传送。
1.7.5
如果第二次挥手时服务器的
ACK
没有送达客户端,会怎样?
客户端没有收到
ACK
确认,会重新发送
FIN
请求。
1.7.6
客户端
TIME_WAIT
状态的意义是什么?
第四次挥手时,客户端发送给服务器的
ACK
有可能丢失,
TIME_WAIT
状态就是用来重发可能丢失的
ACK
报文。如果
Server
没有收到
ACK
,就会重发
FIN
,如果
Client
在
2*MSL
的时间内收到了
FIN
,就
会重新发送
ACK
并再次等待
2MSL
,防止
Server
没有收到
ACK
而不断重发
FIN
。
MSL(Maximum
Segment Lifetime)
,指一个片段在网络中最大的存活时间,
2MSL
就是一个发送和一个回复所需的
最大时间。如果直到
2MSL
,
Client
都没有再次收到
FIN
,那么
Client
推断
ACK
已经被成功接收,则
结束
TCP
连接。
2 Socket
1
什么是
Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个
Socket
。
Socket
通常用来实现客户方和服务方的连接。
Socket
是
TCP/IP
协议的一个十分流行的编
程界面,一个
Socket
由一个
IP
地址和一个端口号唯一确定。
但是,
Socket
所支持的协议种类也不光
TCP/IP
、
UDP
,因此两者之间是没有必然联系的。在
Java
环
境下,
Socket
编程主要是指基于
TCP/IP
协议的网络编程。
socket
连接就是所谓的长连接,客户端和服务器需要互相连接,理论上客户端和服务器端一旦建立
起连接将不会主动断掉的,但是有时候网络波动还是有可能的
Socket
偏向于底层。一般很少直接使用
Socket
来编程,框架底层使用
Socket
比较多,
2 socket
属于网络的那个层面
3 Socket
通讯的过程
基于
TCP
:服务器端先初始化
Socket
,然后与端口绑定
(bind)
,对端口进行监听
(listen)
,调用
accept
阻塞,等待客户端连接。在这时如果有个客户端初始化一个
Socket
,然后连接服务器
(connect)
,如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务
器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次
交互结束。
基于
UDP
:
UDP
协议是用户数据报协议的简称,也用于网络数据的传输。虽然
UDP
协议是一种不
太可靠的协议,但有时在需要较快地接收数据并且可以忍受较小错误的情况下,
UDP
就会表现出
更大的优势。我客户端只需要发送,服务端能不能接收的到我不管