一. TCP协议的三次握手和四次挥手:
首先传输层的由来: 网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用
程序.
你的电脑上可能同时开启QQ、暴风影音等多个应用程序,那么我们通过ip和mac找到了一台特定的主机,如
何表示这台主机上的应用程序,答案就是端口,端口就是应用程序与网卡关联的编号.
传输层的功能: 建立端口到端口的通信
端口的范围是0-65535,其中0-1023位系统占用端口
TCP协议:
也成为可靠传输/好人协议/流式协议,TCP数据报没有长度限制,理论上可以无限长,但是为了保证网络的效率,
通常TCP数据报的长度不会超过IP数据报的长度,以确保单个TCP数据包不必再分割
了解:之所以称TCP协议为可靠协议或者好人协议,是因为无论是谁发过来的连接请求,它都会进行相应并与
其连接
UDP协议:
不可靠传输,"报头"部分一共只有8个字节,总长度不超过65535字节,正好放进一个ip数据包
大概了解了这两种协议之后,下面我们来学习TCP的三次握手和四次挥手,首先来看一张比较专业的三次握手
和四次挥手的流程图:
首先分析三次握手的部分:
第一次握手
首先由客户端发出一条连接请求(对应socket中的connet请求)给服务器端,这个时候服务端会进入syn_recv
的状态,客户端发送的请求内容是(syn=1和一个序列seq=x(序列本来时一堆数字,为了方便在这里将他们赋值
给x)),处于监听状态(对应socket中的listen()操作)的服务器收到这条信息之后迅速转换到syn_recv状态
第二次握手
然后会给客户端一个相应内容(ACK=x+1),+1表示服务器端收到了客户端的连接请求,x是客户端的连接请求,
在x的基础上+1表示是基于原来的请求的一个回应,,客户端收到服务器端的回应之后就会处于一个
Established状态,表示客户端到服务端的连接建立成功,因为TCP创建的连接是双向的,这时候服务器端会向
客户端发送一个连接请求(syn=1,seq=y),由于服务器处理数据的速度非常快,所以服务端会从syn_recv状态
迅速的转换成Established状态,但是在多并发的时候或者计算机被syn洪水攻击时,服务器就会出现大量的
syn_recv状态,占用大量的系统资源
第三次握手
同理客户端收到服务器端的连接请求之后,也会给服务器端返回一个数据,内容为(ACK=y+1),这时候服务端
就也变为Established的状态,表示服务器到客户端的连接也创建成功了,
到这里基于TCP的双向连接就建立成功了,但是我们发现这里不是进行了四次握手么,怎么说是三次呢,其实
在服务器端收到客户端的连接请求和服务端给客户端发送连接请求这两次操作并没有冲突,所以将他们合并
成一步完成,到这里就是完整的TCP的三次握手的内容了.
注意:
在公司的实际项目过程中,服务端一般会处在图中客户端的状态,在高并发的状态下,服务器会大量的处于
SYN_RECV状态,这个时候,服务器很可能是遭遇到了syn洪水攻击.
接下来分析一下四次挥手:
三次握手是进行创建连接的,那么四次挥手就是断开连接的过程,和三次握手的过程相似,无论是哪一方先发
起断开连接的请求,因为不确定哪一方先把数据发完.
第一次挥手
一旦一有一端吧数据发完,那么有一条单向的连接就没有必要存在了,就会首先发出一个断开连接的请求
fin=1(一般都是由服务器端先发起断开连接的请求,在公司中服务器要同时服务很多客户端,它巴不得赶紧把
数据发完然后把数据断开好继续为后边的客户端提供服务),主动断开连接的一方这时会进入FIN_WAIT_1的
状态,服务端发起断开连接的请求之后,客户端进入CLOSE_WAIT的状态
第二次挥手
在客户端收到服务端的断开连接的请求之后会发送一个返回信息ACK=1发给服务端,这时服务端状态转换为
FIN_WAIT2
第三次挥手
客户端还会再发送一个断开连接的请求fin=1给服务端,这时服务端的状态再转换为TIME_WAIT
第四次挥手
服务端收到客户端的断开连接请求之后,会给客户端返回一个信息ACK=1,到此四次挥手过程完毕,双向连接
就会彻底断开
由服务端发起断开连接的请求时这四次过程都要走完,并且中间的两个过程不能合并为一步发送,因为在断开
连接的时候,不能确定数据是否发送完成,在数据没有发送完成的时候如果断开连接就会造成丢包的现象,导
致数据不完整.
注意:
在公司的实际项目过程中,服务端一般会处在图中客户端的状态,在高并发的状态下,服务器会大量的处于
TIME_WAIT状态,这个时候,就不是遭遇syn洪水攻击了,这个时候就要考虑计算机的内存够不够用了,内存使
用率高于70%的时候,查看一下CPU的使用率,如果任由这种高并发的情况,太多这种状态存在的话,计算机可
能会出现内存溢出的情况导致计算机崩溃.
1. 基于TCP的套接字
TCP是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
使用TCP的时候,原理上还是要完成三次握手成功建立连接之后才能进行下一步的数据收发和其他操作,在上
一篇博客中我们已经详细介绍了使用TCP的时候,每一个步骤代表的具体意思和要注意的事项,在这里就不在
过多赘述,我们在这里主要介绍一下,在能够实现通信和收发数据的基础上增加新的功能,上篇博客中的服务
端和客户端连接成功之后,都是只能进行一次数据收发之后就会关闭,我们在这里进行优化,在原来的基础上
加上通信循环和连接循环.
加上通讯循环:
使得客户端和服务端可以无限次的进行数据的发送和接收,直到服务端收到客户端的通信完毕的信号或者标
志之后,与当前客户端断开连接
加上连接循环:
在加过通讯循环之后,我们能实现的是客户端连接上服务端之后可以进行多次的数据收发,但是当连接断开之
后,服务器就会停止,不能继续和下一个客户端进行连接,所以我们要加上连接循环来进行优化,使得服务器在
与一个客户端完成数据交互断开之后,还可以继续等待连接下一个客户端.
2. 基于UDP的套接字:
UDP是无连接的,不像TCP一样有启动顺序,它先启动那一端都不会报错