面试盲区TCP/SOCKET/三次握手 - 笔记

七层协议

面试盲区TCP/SOCKET/三次握手 - 笔记

简化为五层协议

面试盲区TCP/SOCKET/三次握手 - 笔记
Java NIO Channel:在Java中,输入、输出流被合并成为Channel(通道可以读也可以写,而一般来说是单向的,只能读或者写,所以之前我们用流进行IO操作的时候需要分别创建一个输入流和一个输出流)

下图可以想象为8就是一个Channel,和百度了建立一个连接。
8指向一个开启的socket,8就是文件描述符
<>表示输入输出
面试盲区TCP/SOCKET/三次握手 - 笔记

fd类似于java当中的变量引用

exec命令解释如下:
exec是一个shell builtin的指令,相当于shell的一个本地方法

面试盲区TCP/SOCKET/三次握手 - 笔记
例如,执行一个exec ls命令之后,ls命令会替换当前的shell外壳程序,直到ls退出,ls所在的线程就会消亡。
面试盲区TCP/SOCKET/三次握手 - 笔记
下图可以看到,执行一个exec ls命令,当ls命令退出后,shell也退出了,连接断开了
面试盲区TCP/SOCKET/三次握手 - 笔记

在Linux中,一切皆文件,可以看到,建立起的socket也是以一个文件的形式存在的。
面试盲区TCP/SOCKET/三次握手 - 笔记
请求百度主页,用的是Http协议。
(下图第一行)首先,人工拼接一个字符串,发给百度(-e用来识别换行符\n),整句含义为:让8指向一个输入输出(双向流),指向一个socket,绑定到一个百度的连接
面试盲区TCP/SOCKET/三次握手 - 笔记
(上图倒数第二行)然后,如下图所示命令,将echo的标准输出重定向到8,仍然用8接收返回的输入流
面试盲区TCP/SOCKET/三次握手 - 笔记
返回内容
面试盲区TCP/SOCKET/三次握手 - 笔记
ls 也有标准输出 0,1,2,可以被重定向
>是重定向符号,使用方式如下所示
面试盲区TCP/SOCKET/三次握手 - 笔记
以上是用户层(应用层)做的。用户层给出命令之后,剩下的交由内核层(传输控制层,网络层,链路层,物理层)来做。

传输层协议:TCP,UDP

TCP协议:面向连接的,可靠的传输协议
TCP的三次握手:客户端要和服务端建立连接的过程,如下
面试盲区TCP/SOCKET/三次握手 - 笔记

三次握手之后,双方才会有服务资源的开辟,才会产生连接,即“面向连接”。

Socket:套接字,是成对出现的(分别是连接一端的IP:port和另一端的IP:port
ip定位到主机端口号定位到应用程序

服务端是明确要占用的,只需要开启一个度固定的端口号
客户端的端口号是随机的
面试盲区TCP/SOCKET/三次握手 - 笔记
同一个端口号,可以连接很多个不同的目标端口(不存在端口被占用冲突的问题,因为可以这样想,一个80端口可以建立好多个连接,是吧)

也就是说,即使65535个端口都用来和www.baidu.com建立连接了,此时这65535个端口仍然可以和www.qq.com建立连接,不会冲突。
面试盲区TCP/SOCKET/三次握手 - 笔记
面试盲区TCP/SOCKET/三次握手 - 笔记

四次分手:双方都要确认断开连接
面试盲区TCP/SOCKET/三次握手 - 笔记

使用tcpdump监听(抓包),可以看到三次握手、四次挥手的过程
面试盲区TCP/SOCKET/三次握手 - 笔记
三次握手到四次分手不可被分割!-> 高并发负载均衡LVS 4 负载均衡服务器
DDos攻击:用一堆肉鸡,发一堆握手请求,不给回复确认,让服务器等待(一段时间才会断开),导致真正的请求无法进入

网络层

面试盲区TCP/SOCKET/三次握手 - 笔记

链路层

MAC地址在每一跳都是不断被重新封装,变化的。
面试盲区TCP/SOCKET/三次握手 - 笔记

面试盲区TCP/SOCKET/三次握手 - 笔记