三次握手的过程:
1次握手:由客户端主动发起握手请求,将TCP报文头部SYN标志位置为1,随机产生一个序号seq=x,发送第一个SYN包给服务器端,客户端从CLOSE状态进入SYN_SENT状态,等待server确认。
2次握手:server端收到来自客户端的数据包后,解析知道了客户端要建立TCP连接的请求,server端将TCP报文头部标志位SYN和ACK都置为1,ack=x+1;并且随机产生一个seq=y,并将数据包发给客户端,server端从LISTEN状态进入SYN_RCVD状态。
3次握手:客户端收到server端返回的确认后,校验ack=x+1值正确,客户端将标志位ACK置为1,ack=y+1,并把数据包发给server, server端收到ACK包后先校验ack=y+1;如果校验成功,那么成功建立TCP连接;
ps:三次握手的数据包被称为握手包,是由操作系统来处理的
四次挥手:正常断开一个TCP连接。tcp连接是全双工通信,所以通信双方每一个方向的接收/发送都需要单独进行关闭。
主动断开TCP连接有可能是server端,也有可能是客户端;正常断开连接是由客户端主动发起的
1次挥手:客户端向server发送一个FIN包,将TCP报文头部FIN状态位置1,向server发送出FIN包后客户端进入FIN_WAIT1;
2次挥手:server收到来自客户端发的FIN包,回复客户端,将TCP报文头部ACK状态位置1,server端由ESTABLISHED状态进入CLOSE_WAIT状态,这时如果server有数据可以继续正常发送,只是不再接收数据了。
3次挥手:当客户端收到ACK包后,客户端从FIN_WAIT1进入到FIN_WAIT2状态。第3次挥手是当server端没有要发送的数据时,将TCP报文头部FIN状态位置1,向客户端发送FIN包,server端从CLOSE_WAIT状态进入到LAST_WAIT状态。
4次挥手:客户端收到server的FIN包后,将TCP报文头部ACK状态位置为1,向server端发送ACK包,由此client客户端从FIN_WAIT2进入到TIME_WAIT状态。server端收到ACK包的时候,进入到CLOSE状态,server端连接正常关闭,2MSL后,客户端正常进入CLOSE状态,client端连接正常关闭。
只有当客户端主动关闭连接时才会有TIME_WAIT状态。
TCP连接的建立:(也是三次握手)
1.TCP是面向连接的传输层协议,建立的连接不是物理的,建立的连接是逻辑上的连接,这个过程也就是TCP三次握手。
2.三次握手:服务器端处于listen监听状态,客户端要想和服务器建立连接connect(),首先要发送一个数据包,这个握手的控制数据包由传输控制层产生的,服务器端收到握手包会返回一个syn+ack包,客户端再回复一个ack包,这三个由通信两端内核里的传输控制层产生的数据包被称为三次握手,与应用软件无关。
3.三次握手可以让通信双方都确认自己是通的,然后双方的操作系统内核为各自应用程序开辟资源。
三次握手之后双方内存里开辟资源开始为应用程序提供服务,这时就有上面的连接了。在这里开辟的资源是物理实际存在的,而连接是没有通道的。
用来描述一个连接的状态信息组合{Socket、序列号和滑动窗口大小},这个状态信息组合就可以被称为是一个连接。
socket: socket五元组{sIP,sport,dIP,dport,protocol}表示网络中唯一的一个网络进程。
序列号:解决TCP乱序的问题。
滑动窗口大小:负责通讯中流量控制。
socket五元组就是通过sIP+sport,dIP+dport还有协议包来标识一个网络通信。协议号就是TCP/UDP,在IP协议头部就会有协议号这个字段,8位协议号是6时标识选择TCP传输层协议,协议号是17时表示选择UDP;
3.TCPl连接中端口号原理
端口号体现在同一台机器开启多个网络进程的场景下:
mac:数据链路层的地址,用来表示同一链路中不同的机器;
IP:IP层中的的地址,用来标识TCP/IP网络中互联的主机和路由器;
端口号:传输层地址;用来识别同一台机器中正在通信的不同的网络进程(即正在通信中的不同应用程序);
如下图为例:
两个客户端采用web浏览器服务器进行通信,通信中采用TCP传输层协议,http应用层协议。当客户端1:192.168.1.114:23535和192.168.1.107:23535同时访问server端120.94.23.180:80时客户端IP地址成了server端区别客户端网络进程的标识;当客户端2的两个网络进程同时访问server端的80端口时,IP相同,这时server端就根据客户端的端口号来标识区分这两个网络进程。
端口号分布:
1.标准固定的端口号:分布范围:0-1023。静态分配。每个应用程序的端口号固定,其他应用程序不可随意使用。比如http 80端口。
2.被正式注册的端口号:分布范围:1024-49151。这个范围内的端口号可用于任意通信中。
3.时序分配端口号:分布范围:49152-65535。客户端与服务器端通信时,客户端无需绑定端口号,而是完全有操作系统随机动态分配端口号。
TCP的特点:面向连接;通讯双向性—TCP是全双工通信协议;支持多连接和多点标识(TCP连接由相连接的一对套接字来表示);可靠的传输层协议;确认机制;流式传输数据流(流式传输;非结构化数据;数据流管理);支持流量控制管理。
TCP是基于字节流传输的传输层协议。
TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
UDP传输层协议本身不提供复杂的控制机制,是面向无连接的传输层协议;
如果收到应用层要发送的数据时,立即发送到网络上。单次socket sendto()数据大小受限于UDP头16位数据包长度65535的限制,如果UDP数据包长度超过这个值,sendto()失败,返回值为-1(返回0,表示发送成功)
特点:如果网络堵塞的场景下,UDP不能进行流量控制和避免网络拥塞的操作;并且传输过程中会出现丢包乱序的问题。如果实际开发中需要以上细节处理,交给UDP的应用层程序去处理。
可靠UDP协议的设计:参考TCP可靠的特性主要是通过序列号,确认应答机制,重发机制,连接管理,滑动窗口控制等机制来实现的。
如何保证UDP的可靠:
seq序列号:解决网络数据包不乱序的问题;
在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,seq的大小就「累加」一次。
ack应答序号:来解决不丢包的问题;
指下一次收到的数据的序列号[期望值],发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。