简介TCP三次握手TCP四次断开
简介传输层(Transport Layer) 主机应用程序之间提供端到端的连接。
两大传输层协议
- 传输控制协议TCP (Transport Control Protocol)用户数据报协议UDP (User Datagram Protocol)
1.传输控制协议(TCP)
用于面向连接的传输可靠的、面向连接的协议传输效率高
2.用户数据报协议(UDP)
用于简单消息传输不可靠的、无连接的服务传输效率高
TCP的工作原理
连接与断开流量控制拥塞控制差错控制计时器
TCP封装格式
URGRNT紧急位,紧急指针有效ACK确认位,确认序号有效PSH急迫位,接收方应该尽快将这个报文交给应用层RESET重置位,重置连接SYNC同步位,发起一个新连接FINISH终止位,释放一个连接
传输层提供逻辑连接的建立、传输层寻址、数据传输、传输连接释放、流量控制、拥塞控制、多路复用和解复用、崩溃恢复等服务。
端口号
范围:0-66535(2^16=65536 16位端口号)常用0-1023系统端口SSH-----22 ,DNS-----53,HTTP-----80
MYSQL-----3306,远程桌面-----3389,Tomcat-----8080, DNS域名 解析domain-----53Linux记录端口号文件 /etc/services查看Linux建立的连接netstat -an
TCP三次握手
以web服务为例
第一次握手:建立连接时,客户端主动发送一个起始序列号seq=x(x随机产生)的TCP报文,标记位为SYN=1,表示“请求建立新连接”,状态变为SYN_SENT,等待服务端的确认。第二次握手:服务端接收到来自客户端的序列号为seq=x的TCP报文,查看到SYN=1,知道客户端有一个请求建立连接,将客户端的起始序列号x存起来,服务端返回一段TCP报文,报文段的序列号seq=y随机产生,发送确认号ack=x+1,表示确认收到服务器端请求,标志位SYN+ACK的报文段(SYN=1,ACK=1)同意建立连接,结束LISTEN阶段此时服务器进入SYN_RECV状态。第三次握手:客户端接收到来自服务器端的确认收到数据SYN+ACK报文之后,查看ACK=1,ack=x+1正确,知道服务端收到序列号为x的报文,同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号seq=y给存下来。向服务端返回最后一段序列号seq=x+1的TCP报文,确认号ack=y+1表示收到服务器端同意连接的信号 ,确认结束SYN_SENT阶段,进入ESTABLISHED状态。当服务端收到报文后发现ACK=1并且ack=y+1,就知道客户端收到序列号为y的报文了,客户端和服务端都进入ESTABLISHED(TCP连接成功)状态。 TCP四次断开
比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。
第一次挥手:假设客户机打算关闭连接,就向其TCP发送一个连接释放报文段,释放连接报文包含FIN标志位FIN=1、序列号seq=u,u是客户端发送数据的最后一个序列号+FIN占据的序列号1,也就是100+1000+1。客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据。第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文ACK=1,确认号ack=u+1,序列号seq=v,v是服务端发送数据的最后一个序列号也就是300+2000。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于CLOSE-WAIT状态。但服务端可能还有数据没发完,服务器发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=u+1、序列号seq=w(2300+50)。第四次挥手:客户端收到服务端发的连接释放报文段后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=w+1(2351)、序列号seq=u+1(1102)。此时TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。



