TCP 是面向连接的、可靠的、基于字节流的传输层协议
面向连接:一定是[一对一]才能连接,无法做到[一对多]
可靠的:无论网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端
基于字节流:消息是[有序的],当[前一个]消息没有收到的时候,即使它先收到了后面的字节,那么也不能扔给应用层去处理,同时对[重复]的报文会自动丢弃
①TCP 四元组可以唯一的确定一个连接,四元组包括如下:
源地址、源端口、目的地址、目的端口
②最大TCP连接数 = 客户端的IP数 * 客户端的端口数
③端口就是为了确定是主机的哪一个进程
- TCP三次握手
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/55b2b2d508cff53c181997cfe62820fb.png)
首先服务器端处于LISTEN(监听)状态,等待客户端的连接请求
客户端向服务器端发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 seq=x
服务器端收到连接请求报文,如果同意建立连接,则向客户端发送连接确认报文,SYN=1,ACK=1,确认应答号为ack=x+1,同时也选择一个初始的序号 seq=y
客户端收到服务器端的连接确认报文后,还要向服务器端发出确认,确认应答号为ack=y+1,序号为seq=x+1
服务器端收到客户端的确认后,连接建立
- 其中前两次握手无法携带数据,但是第三次握手可以携带数据
首先,三次握手是为了建立可靠的通信通道,双方确认自己与对方的发送与接收都是正常的
第一次握手,服务器端确定了客户端发送正常,自己接收正常
第二次握手,客户端确定了服务器端发送、接收正常,自己发送、接收正常
第三次握手,服务器端确定了客户端发送正常,自己接收正常
其次,三次握手就已经是理论上最少可靠连接建立,无需更多的通信次数
传回ACK是服务器端告诉客户端,接收到的信息就是客户端发送的信息,说明客户端到服务器端的通信是正常的
传回SYN是为了建立服务器端到客户端的通信
- TCP四次挥手
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/998ca3073945e89236334c9514fb8047.png)
客户端发送连接释放报文,FIN=1,并给一个序号seq=u
服务器端收到之后发出确认,ACK=1,seq=v,ack=u+1,此时TCP处于半关闭状态,服务器端能向客户端发送数据但是客户端不能在向服务器端发送数据,等待服务器端将未传送完的数据传送完
当服务器端不在需要连接时,发送连接释放报文,FIN=1,ACK=1,seq=w,ack=u+1
客户端收到后发出确认,ACK=1,seq=u+1,ack=w+1进入等待(TIME-WAIT)状态,等待最大2最大报文存活时间(MSL)后释放连接
服务器端收到客户端的确认后释放连接
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。
这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文
确保最后一个确认报文能够到达,如果服务器端没收到客户端发送来的确认报文,那么服务器端就会重新发送连接释放请求报文,客户端等待一段时间就是为了处理这种情况的发生
- 在浏览器中输入 url 地址 ->> 显示主页的过程
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6031ed4c9a2bac08b30e48b4d74160eb.png)
1) 浏览器解析URL,并生成HTTP请求报文(HTTP协议)
2) DNS域名解析,查询服务器域名对应的IP地址
本地DNS服务器-----若缓存中存在则直接返回IP,若不存在
根域名服务器------告知.com顶级域名服务器的地址
顶级域名服务器----告知www.**.com的权威域名服务器的地址
权威域名服务器----告知对应IP地址
3) 建立TCP连接(通过传输层时)
通过三次握手,然后再HTTP报文上加上TCP头部
4) 通过网络层的IP时,在报文上加上IP头部
5) 通过网络层的MAC时,
ARP协议:从IP地址获取MAC地址
在报文上加上MAC头部,包含接受方和发送方的MAC地址
6) 服务器处理请求
一层层处理报文的头部,得到HTTP请求报文,然后将其中请求的资源封装到HTTP响应报文中
HTTP相应报文又一层层加上TCP、IP、MAC头部后,返回客户端
7) 客户端处理响应报文(去除头部信息),渲染页面
8) 断开TCP连接