2- TCP(一)
一、TCP/IP协议(族)
TCP/IP协议:指一类协议的总称
协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。
早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和 Microsoft都有各自的网络协议,互不兼容。直到1974年,TCP/IP诞生,TCP/IP有一个非常重要的特点,就是开放性,TCP/IP的规范和Internet的技术都是公开的。目的就是使任何厂家生产的计算机都能相互通信。
二、网络模型
三、TCP/IP
TCP/IP 四层模型
使用tcpdump访问baiidu.com,使用Wireshark抓包分析
查看序号4的报文
五层模型
五层模型是把 TCP/IP的网络接口层拆成物理层和数据链路层
- 物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异
简单来说:物理层负责把两台计算机连起来,然后在计算机之间通过高低电频来传送0,1这样的电信号。
- 数据链路层
将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束(定义电信号的分组方式)
- 一组电信号构成一个数据包,我们把这个数据包称之为帧
- 每一数据帧分成:报头head和数据data两部分
head包含:(固定18个字节)
- 发送者/源地址,6个字节
- 接收者/目标地址,6个字节
- 数据类型,6个字节
data包含:(最短46字节,最长1500字节)
- 数据包的具体内容
head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送
mac地址:连入网络的每一个计算机都会有网卡接口,每一个网卡都会有一个唯一的地址,这个地址就叫做 MAC 地址,计算机之间的数据传送,就是通过 MAC 地址来唯一寻找、传送的。
Wireshark抓包,网络接口层
网络层
世界范围的互联网是由一个个彼此隔离的小的局域网组成的 ,网络层的功能就是让我们在茫茫人海中,能够找到另一台计算机在哪里
网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址
传输层
ip和mac找到了一台特定的主机,用端口标识主机上的通信程序,端口即应用程序与网卡关联的编号。
传输层的功能就是建立端口到端口的通信,相比网络层的功能是建立主机到主机的通信。
传输层有两种协议,TCP和UDP
应用层
该层包括所有和应用程序协同工作,利用基础网路交换应用程序专用的资料的协定。 应用层是大多数普通与网路相关的程式为了通过网路与其他程式通讯所使用的层。这个层的处理过程是应用特有的;数据从网路相关的程序以这种应用内部使用的格式进行传送,然后编码成标准协定的格式。
一些特定的程序视为在此层运行。它们提供服务直接支援使用者应用。这些程序和它们对应的协定包括HTTP(超文本传输协议)、FTP(文件传输)、SMTP(电子邮件)、SSH(安全远端登录)、DNS(名称⇔IP位址寻找)以及许多其他协定。
四、TCP
TCP (Transmission Control Protocol) 简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
特点:
- 面向连接
- 通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
- 可靠传输
- TCP 采用发送应答机制
- 超时重传
- 错误重传
- 流量控制和阻塞管理
TCP三次握手
- 客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,由浏览器发起,告诉服务器我要发送请求了)
- 服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息(第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧)
- 客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧)
数据传输
每一次数据的传输都会有ACK确认包
TCP四次挥手
客户端接受到服务端的响应后,会主动调起close()
- 发起方向被动方发送报文,Fin、Ack、Seq,表示已经没有数据传输了。并进入 FIN_WAIT_1 状态。(第一次挥手:由浏览器发起的,发送给服务器,我请求报文发送完了,你准备关闭吧)
- 被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2 状态。(第二次挥手:由服务器发起的,告诉浏览器,我请求报文接受完了,我准备关闭了,你也准备吧)
- 被动方向发起方发送报文段,Fin、Ack、Seq,请求关闭连接。并进入 LAST_ACK 状态。(第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完了,你准备关闭吧)
- 发起方向被动方发送报文段,Ack、Seq。然后进入等待 TIME_WAIT 状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)
为什么是四次挥手而不是三次挥手
关闭连接时需要四次挥手,比建立连接时多一次,是因为被动关闭端(服务端),或许 还有数据没有发送出去,第一次和第二次挥手,只说明客户端告知服务端,我不再给你发送数据 ,关闭发送数据的通道,服务端说“好”,第三次挥手是告诉客户端,服务端的数据发送完了,客户端你可以关闭接受数据的通道了。
参考文章:经典面试题:从 URL 输入到页面展现到底发生什么?