所谓三次握手(
Three-Way Handshake)即建立
TCP连接,就是指建立一个
TCP连接时,需要客户端和服务端总共发送
3个包以确认连接的建立。在
socket编程中,这一过程由客户端执行
connect来触发,整个流程如下图所示:
图
2 TCP三次握手
(1
)第一次握手:
Client
将标志位
SYN
置为
1
,随机产生一个值
seq=J
,并将该数据包发送给
Server
,
Client
进入
SYN_SENT
状态,等待
Server
确认。
(
2)第二次握手:
Server收到数据包后由标志位
SYN=1知道
Client请求建立连接,
Server将标志位
SYN和
ACK都置为
1,
ack=J+1,随机产生一个值
seq=K,并将该数据包发送给
Client以确认连接请求,
Server进入
SYN_RCVD状态。
(
3)第三次握手:
Client收到确认后,检查
ack是否为
J+1,
ACK是否为
1,如果正确则将标志位
ACK置为
1,
ack=K+1,并将该数据包发送给
Server,
Server检查
ack是否为
K+1,
ACK是否为
1,如果正确则连接建立成功,
Client和
Server进入
ESTABLISHED状态,完成三次握手,随后
Client与
Server之间可以开始传输数据了。
2.
四次挥手
所谓四次挥手(
Four-Way Wavehand)即终止
TCP连接,就是指断开一个
TCP连接时,需要客户端和服务端总共发送
4个包以确认连接的断开。在
socket编程中,这一过程由客户端或服务端任一方执行
close来触发,整个流程如下图所示:
图
3 TCP四次挥手
由于TCP
连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个
FIN
来终止这一方向的连接,收到一个
FIN
只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个
TCP
连接上仍然能够发送数据,直到这一方向也发送了
FIN
。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(
1)第一次挥手:
Client发送一个
FIN,用来关闭
Client到
Server的数据传送,
Client进入
FIN_WAIT_1状态。
(
2)第二次挥手:
Server收到
FIN后,发送一个
ACK给
Client,确认序号为收到序号
+1(与
SYN相同,一个
FIN占用一个序号),
Server进入
CLOSE_WAIT状态。
(
3)第三次挥手:
Server发送一个
FIN,用来关闭
Server到
Client的数据传送,
Server进入
LAST_ACK状态。
(
4)第四次挥手:
Client收到
FIN后,
Client进入
TIME_WAIT状态,接着发送一个
ACK给
Server,确认序号为收到序号
+1,
Server进入
CLOSED状态,完成四次挥手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:
图
4 同时挥手
3.HTTP 协议中GET和POST
HTTP 定义了与服务器交互的不同方法,最常用的有4种,Get、Post、Put、Delete,如果我换一下顺序就好记了,Put(增),Delete(删),Post(改),Get(查),即增删改查,下面简单叙述一下:
1)Get, 它用于获取信息,注意,他只是获取、查询数据,也就是说它不会修改服务器上的数据,从这点来讲,它是数据安全的,而稍后会提到的Post它是可以修改数据的,所以这也是两者差别之一了。
2) Post,它是可以向服务器发送修改请求,从而修改服务器的,比方说,我们要在论坛上回贴、在博客上评论,这就要用到Post了,当然它也是可以仅仅获取数据的。
3)Delete 删除数据。可以通过Get/Post来实现。用的不多,暂不多写,以后扩充。
4)Put,增加、放置数据,可以通过Get/Post来实现。用的不多,暂不多写,以后扩充。
下面简述一下Get和Post区别:
1) GET请求的数据是放在HTTP包头中的,也就是URL之后,通常是像下面这样定义格式的,(而Post是把提交的数据放在HTTP正文中的)。
login.action?name=hyddd&password=idontknow&verify=%E4%BD%E5%A5%BD
a,以 ? 来分隔URL和数据;
b,以& 来分隔参数;
c,如果数据是英文或数字,原样发送;
d,如果数据是中文或其它字符,则进行BASE64编码。
2)GET提交的数据比较少,最多1024B,因为GET数据是附在URL之后的,而URL则会受到不同环境的限制的,比如说IE对其限制为2K+35,而POST可以传送更多的数据(理论上是没有限制的,但一般也会受不同的环境,如浏览器、操作系统、服务器处理能力等限制,IIS4可支持80KB,IIS5可支持100KB)。
3)Post的安全性要比Get高,因为Get时,参数数据是明文传输的,而且使用GET的话,还可能造成Cross-site request forgery攻击。而POST数据则可以加密的,但GET的速度可能会快些。
4.
网络通信的关键类和方法
(
1)重要的网络访问类
HttpUrlConnection
(2)get请求的全流程:

Post请求:

(3)HTTP请求报文和HTTP响应报文
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

<request-line
>
<
headers>
<
blank line>
[
<
request-body
>
HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。
如下所示,HTTP
响应的格式与请求的格式十分类似:
<
status-line>
<
headers>
<
blank line>
[
<
response-body
>
]