计算机网络基础知识
OSI七层模型
- 物理层:定义物理设备的标准,将比特流转换为电流强弱传输(数模转换与模数转换)
- 数据链路层:
- 网络实体间数据链路通路建立、维持和释放管理(点对点信道和广播信道)
- 物理层在传输介质上传输会存在误差,因此数据链路层也会在物理层之上采用差错检测、流量控制等
- 网络层:物理寻址,找最佳路径(为数据包选路由器等)
- 传输层:需要切分数据包,拆分后要分配序列号,接收后会排序(三次握手四次挥手)
- 会话层:不同机器间建立会话和管理会话(自动收发包和寻址)
- 表示层:解决不同系统间通信语法问题(规定发送接收必须固定消息头和消息体等)
- 应用层:发送进程
常用协议划分
- http:应用层协议
- tcp:传输层协议
- rpc:跨越传输层和应用层
三次握手(全双工)
- 握手步骤:
- 第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;
- 第二次握手:Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;
- 第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就可以开始传输数据。
- 状态变化:A、B关闭状态CLOSED——B收听状态LISTEN——A同步已发送状态SYN-SENT——B同步收到状态SYN-RCVD——A、B连接已建立状态ESTABLISHED
- 作用:
- 建立全双工的链接
- 初始化SYN值,即序列号
- 问题:
- 连接超时(等待时长:1+2+4+8+16+32=63秒)
- 遭SYN洪水攻击
- 建立连接后,client出问题?发送保活探测报文,连接次数超时处理。
- 握手步骤:
四次挥手
- 挥手步骤
- A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
- B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
- A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
- B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
- A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。
- 状态变化:A、B连接建立状态ESTABLISHED——A终止等待1状态FIN-WAIT-1——B关闭等待状态CLOSE-WAIT——A终止等待2状态FIN-WAIT-2——B最后确认状态LAST-ACK——A时间等待状态TIME-WAIT——B、A关闭状态CLOSED
- 问题:
- 为什么有time_wait状态:1.留足够时间让对方收到ACK包。2.避免新旧链接混淆
- 为什么需要四次挥手:全双工,发送和接收方都需要FIN报文和ACK报文
- 服务器出现大量close_wait:
- 对方关闭连接,我方忙于读写操作,没及时关闭
- 线程池配置不合理。
- close_wait与文件句柄一一对应,如果太多也会出现 too many open files
- 挥手步骤
socket:socket是对tcp/ip协议的抽象,是操作系统对外开放的接口。是进程与tcp、udp等协议的中介。
参考资料: