文章目录
TCP/IP分层结构
层次结构 | 功能 |
---|---|
应用层 | 应用程序可以使用各种各样的协议 |
传输层(TCP/UDP) | 确保发送数据可以到达目标主机,完成数据传输 |
网络层 | 填写数据包地址,选择数据传输路径 |
数据链路层 | 融合不同连接方式的的链路,屏蔽网络差异 |
物理层 | 由具体的连接方式决定,无线和有线,光纤 |
TCP/IP工作方式
发送端
应用层 | 编码后发送字符串数据 |
---|---|
传输层 | 将数据分包,加上标识头,序号等通用信息 |
网络层 | 加上传输地址,选择最佳传输路径 |
数据链路层 | 将数据封装并转换为二进制序列 |
物理层 | 将二进制序列转换为物理信号,比如光,无线电波 |
接收端
应用层 | 收到字符串,根据应用层协议进行解码 |
---|---|
传输层 | 根据附加信息进行数据组包,恢复原始应用层数据形态 |
网络层 | 解析二进制序列,恢复传输层数据形态 |
数据链路层 | 将二进制序列进行组装,恢复原始网络层数据形态 |
物理层 | 将物理信号转换为二进制序列 |
深入理解网络层(IP层)
ip寻址
- ip地址属于网络层地址,用于标识网络上的主机
ip路由控制
- 控制数据如何到达目标主机(需要通过哪些路由进行转发)
无连接
- 数据包根据ip地址在网络上传输
mac地址
- 数据链路层使用的硬件地址。mac地址和网络无关,出厂时写入到网络设备中,当主机在网络上收到一个数据帧时,首先检查里面的mac地址是否和当前主机一致,如果一致进行下一步处理,如果不一致直接丢弃。
ip地址和mac地址
- ip地址是动态的,不特定于某个硬件。
- ip地址是网络层使用的地址。
- mac地址是数据链路层使用的地址(用于确认目标网络中数据的主机)。
- 路由器中记录了本网络中主机ip于mac地址的映射关系。
IP路由控制
为了将数据发给目标主机,所有主机都维护了一张路由表,路由表记录了ip数据包下一步该发给哪个路由器。
路由表获取方式
- 手动创建路由表。
- 通过特定协议创建。
IP数据转发
- 尽力转发,不保证结果。
- 转发时通过附加信息检查合法性,出现异常不会进行重发。
- 以包为单位进行转发,不保证到达。
传输控制协议
TCP在协议上实现提供可靠数据传输
- TCP中不存在数据包的概念,实现了流式数据传输
- TCP内部有服务状态,能够精确的知道数据是否已经发送成功,是否已经被接收
- TCP在行为傻姑娘可以进行阻塞控制。
TCP 三次握手
下面是TCP的头部信息,通过头部信息可以更清楚的认识三次握手过程。
第一次握手
客户端创建了socket在调用connect之前一直处于CLOSED状态,当调用connect之后,客户端会发送一个SYN(SYN = 1,seq = J)报文,然后进入到SYN_SENT状态,服务器端收到后变为SYN_RECVD状态。
第二次握手
服务端对客户端做出应答(SYN = 1,ACK = 1,seq = K,ack = J + 1),
客户端在收到后转换为ESTABLISHED状态。
第三次握手
客户端向服务端做出应答(ACK = 1,ack = K + 1),服务端收到应答后由SYN_RECVD转换为ESTABLISHED状态。
TCP天生的缺陷(DDoS攻击)
- 客户端收到SYNC,ACK后,不再回复最后的ACK信息
- 这将导致服务端资源消耗,但是并不会进行实际通讯
- 当多个傀儡客户端同时对服务端请求连接,服务端资源将被耗尽。
TCP 四次挥手
第一次挥手
客户端向服务器发送一个FIN(FIN = 1,seq = J)报文,告诉服务器不会再发送数据了,然后切换到FIN_WAIT1状态。
第二次挥手
服务器接收到FIN(FIN = 1,seq = J)报文, 对客户端做出应答(ACK = 1,seq = K,ack = J + 1),告知客户端已经收到消息,此时服务器由ESTABLISH状态转换为WAIT_CLOSE状态,客户端收到应答后转换为FIN_WAIT2状态。
第三次挥手
服务器发送FIN报文(FIN = 1,ACK = 1,seq = L,ack = J + 1),进入到LAST_ACK状态。客户端接收到后由FIN_WAIT2状态进入TIME_WAIT状态。
第四次挥手
客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段(ACK = 1, seq = J + 1, ack = L + 1),服务器收到后进入CLOSE状态,客户端等待2MSL后,也进入CLOSE状态。
UDP
特点:完全继承网络层的工作方式
- 无连接,直接指定IP地址和端口即可发送数据
- 监听固定端口,只要有数据统统接收
- 不管网络情况,只要是数据统统可发送
- 不关心数据是否到达
UDP使用场合:
- 对数据不敏感,需要实时性的场合
- 网络环境比较好的场合
- 需要深度定制协议的场合