4.传输层
为两台主机上的应用程序提供端到端的服务(进程间通信的服务)
端口:标识一个应用程序,它是应用程序的代号
一个进程可以有几个端口
总结常用端口:
FTP:21 TELNET:23 SMTP:25 TFTP:69 HTTP:80 SNMP:161 Mysql:3306
套接字:唯一标识了网络中的一个主机和它上面的一个进程
A主机把“hello”发给B主机的过程?
1.主机A在本机的路由表中查询匹配主机B的IP的网络号;
2.如果能够查询到,说明主机B和主机A在同一网段(通常是在同一局域网内),则下一跳即为主机B。主机A在ARP缓存中查找主机B的MAC地址(如没有则先发送ARP广播),然后将数据包封装成帧发送至通信线路上。该帧的源MAC是主机A的MAC地址,目的MAC是主机B的MAC地址。
1)如果主机A和主机B是网线直连的,那么主机B直接收到主机A发来的帧。
如果主机A和B是通过交换机相连的,交换机的某个端口收到主机A发来的帧,然后根据帧中的目的MAC地址在MAC地址表中查询对应的转发端口。如果找到了,直接从该端口转发出去;如果没找到,则在除了接收到数据包以外的所有端口进行转发(广播)。
2)如果主机A和B是通过路由器相连的,路由器的某个端口收到主机A发来的帧,其后的处理流程见步骤4。
3.如果不能查询到,说明主机A和主机B不处于同一网络中,需要通过网关来进行跨网络的通信。主机A会通过默认网关(通常是路由器)来提交报文,即下一跳是路由器。主机A根据网关的IP在自己的ARP缓存中查找对应的MAC地址(如没有则先发送ARP广播),然后将数据包封装成帧发送至通信线路上。该帧的源MAC是主机A的MAC,目的MAC是路由器的MAC。
4.当网关路由器接收到数据帧时,首先提取包头中的目的MAC地址,在MAC表进行查询。如果找到对应项,则按对应的端口进行转发(这一步实现了与交换机一样的功能);如果没找到对应项,则提取数据包包头中的目的IP。
1)如果目的IP是自己(这是可能的,比如ping路由器),则交由上层处理。
2)如果目的IP不是自己,则需要进行转发,在路由表中查询目的IP的转发端口和下一跳IP。若找到了对应的路由表项,则按照路由表项转发;若没找到对应的路由表项,则按照缺省路由进行转发。转发时,源和目的IP地址不变,源MAC地址改为转发端口的MAC地址,目的MAC地址改为下一跳IP的MAC地址。
TCP(传输控制协议):面向连接 可靠的 流式服务
可靠:超时重传 应答确认机制 滑动窗口进行流量控制
面向连接:在通信之前,先建立连接,-》通过三次握手建立连接,-》断开-》通过四次挥手
流式服务:数据没有起始和末尾,没有边界限制 多次发送,可以被对方一次接受 可能出现粘包
TCP报头:
序号:第一个字节的序号
确认号:期望收到对方下一个报文段的第一个数据字节
数据偏移:首部长度4B为单位
紧急位URG:URG=1时,标明此报文段中有紧急数据,是高优先级数据
确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1
推送位PSH:PSH=1时,接收方尽快交付接受应用进程
复位RST:RST=1时,TCP连接中出现严重差错
同步位SYN:SYN=1时,表明是一个连接请求/连接接受报文
终止位FIN:FIN=1时,表明此报文段发送方数据已发送完,要求释放连接
窗口:接收窗口
紧急指针:紧急数据的字节数
三次握手:
1.客户端发送连接请求报文段,无应用层数据 seq序号随机
2.服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文,允许连接,无应用层数据 i+1(对客户的SYN报文段进行确认)
3.客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据
1.三次握手哪些阶段可能收到攻击?
SYN泛洪/溢出攻击 半连接状态太多(买奶茶)第二阶段
2.为什么是三次,不是2次?(举反例)
已失效的连接请求报文
四次挥手:
1.客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接
2.服务器端回送一个确认报文段,客户到服务器端这个方向的连接就释放了——半关闭状态
3.服务器端段发完数据,就发出连接释放报文段,主动关闭tcp连接
4.客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底释放(要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 ACK 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。)
1.四次挥手,可不可以是三次?
可以是三次
2.哪个阶段可能收到攻击?
time_wait状态存在的意义:
1.可靠的终止TCP的连接
2.能够让迟来的报文被识别并丢弃
怎么解决粘包?
1.send/recv/send
2.数据添加头和尾
TCP拥塞控制:
UDP(用户数据报协议):无连接 不可靠 数据报 (视频)
面向报文:对应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整报文,一次性传输少量报文
UDP报头:
源端口号:可有可无(是否需要回信)
如何使用UDP实现可靠传输?
自己在应用层完成可靠传输
TCP和UDP不同/特点
SCTP(流控制传输协议)
nestat -natp 查看TCP连接状态
tcp 编程流程
1.多进程方式实现并发
2.多线程的方式并发
3.线程池/进程池(创建固定数目,不结束)高频率的申请和销毁使用
4.可以使用io复用技术,实现多个客户端的处理
负载均衡/集群:业务逻辑复制一份部署到新主机
集群--负载均衡配合
分布式:如流水线
缓存