面试盲区TCP/SOCKET/三次握手 - 笔记
七层协议
简化为五层协议
Java NIO Channel
:在Java中,输入、输出流被合并成为Channel(通道可以读也可以写,而流一般来说是单向的,只能读或者写,所以之前我们用流进行IO操作的时候需要分别创建一个输入流和一个输出流)
下图可以想象为8
就是一个Channel,和百度了建立一个连接。8
指向一个开启的socket,8
就是文件描述符<>
表示输入输出
fd
类似于java当中的变量引用
exec命令解释如下:exec
是一个shell builtin
的指令,相当于shell的一个本地方法
例如,执行一个exec ls
命令之后,ls
命令会替换当前的shell外壳程序,直到ls退出,ls所在的线程就会消亡。
下图可以看到,执行一个exec ls
命令,当ls
命令退出后,shell
也退出了,连接断开了
在Linux中,一切皆文件,可以看到,建立起的socket也是以一个文件的形式存在的。
请求百度主页,用的是Http协议。
(下图第一行)首先,人工拼接一个字符串,发给百度(-e
用来识别换行符\n),整句含义为:让8指向一个输入输出(双向流),指向一个socket,绑定到一个百度的连接
(上图倒数第二行)然后,如下图所示命令,将echo
的标准输出重定向到8
,仍然用8
接收返回的输入流
返回内容
ls 也有标准输出 0,1,2
,可以被重定向>
是重定向符号,使用方式如下所示
以上是用户层(应用层)做的。用户层给出命令之后,剩下的交由内核层(传输控制层,网络层,链路层,物理层)来做。
传输层协议:TCP,UDP
TCP协议:面向连接的,可靠的传输协议
TCP的三次握手:客户端要和服务端建立连接的过程,如下
三次握手之后,双方才会有服务资源的开辟,才会产生连接,即“面向连接”。
Socket
:套接字,是成对出现的(分别是连接一端的IP:port
和另一端的IP:port
)ip
定位到主机,端口号
定位到应用程序
服务端是明确要占用的,只需要开启一个度固定的端口号
客户端的端口号是随机的
同一个端口号,可以连接很多个不同的目标端口(不存在端口被占用冲突的问题,因为可以这样想,一个80端口可以建立好多个连接,是吧)
也就是说,即使65535个端口都用来和www.baidu.com
建立连接了,此时这65535个端口仍然可以和www.qq.com
建立连接,不会冲突。
四次分手:双方都要确认断开连接
使用tcpdump
监听(抓包),可以看到三次握手、四次挥手的过程
三次握手到四次分手不可被分割!-> 高并发负载均衡LVS 4 负载均衡服务器
DDos攻击:用一堆肉鸡,发一堆握手请求,不给回复确认,让服务器等待(一段时间才会断开),导致真正的请求无法进入
网络层
链路层
MAC地址在每一跳都是不断被重新封装,变化的。