TCP/IP三次握手,四次分手
1.引出问题
与www.baidu.com建立连接
1 | exec 9<> /dev/tcp/www.baidu.com/80 |
任何程序都有IO(fd为文件描述符,可以理解为Java中的new出来的File变量)

图中fd为9u的连接是由内核建立的socket连接
将符合HTTP协议的字符串,通过标准输出重定向到9,字符串就会通过9这个socket发送到百度的服务器(给百度发送了HTTP协议的请求头“文本”)
1 | echo -e "GET /HTTP/1.0\n" 1>& 9 |
读取9,得到百度的主页
1 | cat 0<& 9 |
由上例可以得出,连接无需人来操作;而连接上以后,B/S之间的通信,发送的数据就需要协议了(HTTP协议)
2.什么是连接,如何建立?
应用层想要发送HTTP,这时需要一个连接,应用层阻塞并调用了传输控制层。
2.1.传输控制层
协议:UDP,TCP
Q:什么是TCP协议?
- 面向连接
- 可靠的传输协议
Q:什么是TCP的三次握手、四次分手?
三次握手:
- S处于监听状态,此时C发送一个数据包syn(由传输控制层发送)到S;
- S收到C发送的数据包syn后,返回一个数据包syn+ack;
- C收到S发送的数据包syn+ack,返回一个数据包ack。
- 均由两端内核的传输控制层来通信;
- 三次握手可以确认双方的通信是畅通的,三次握手后,双方为对方在内存中开辟资源(物理),资源为对方提供响应服务,此时便是创建了一个连接;
- 三次握手的确认机制使得TCP是一个可靠的传输协议。
- 三次握手之后才允许传输数据,传输控制层进入阻塞状态,调用网络层
socket:四元组:C:ip:port + S:ip:port,称为一个套接字,对这个四元组使用了一个文件描述符来代表,比如9,可以对9进行读写操作,
四次分手(为了释放资源):
- C向S发送数据包fin,发出释放连接请求;
- S向C发送数据包fin+ack,返回确认请求;
- S向C发送数据包fin,发出释放连接请求;
- C向S发送数据包ack,返回确认请求;
2.2.网络层
IP
route表:路由表是为了寻找下一跳

例:
首先会将需要连接的ip地址和路由表中每一条数据的子网掩码进行与操作,得到的结果再和路由表中每一条数据的destination进行对比:
- 若需要连接的ip为局域网内的ip,则ip和路由表的第一条数据的子网掩码进行与操作,其结果在上图的路由表中的destination中找到了,所以不需要走网关,即网关为0.0.0.0,直连;
- 若需要连接的ip若外网的ip,比如上图的ping www.baidu.com操作,则ip和路由表的第一条数据的子网掩码进行与操作,其结果为61.135.169.0,在路由表中的destination中找不到,所以继续和路由表的第二条数据的子网掩码进行与操作,得到结果0.0.0.0,可以再destination中找到,所以需要走网关192.168.150.2(一般为连接外网的路由器),此时发现一个问题,需要发送的数据包中应当包含下一跳的地址(即网关192.168.150.2),和目标地址61.135.169.125,由此引入了数据链路层
2.3.数据链路层
一个数据包应当包含:网关地址(MAC),目标ip,目标port
链路层的ARP协议会请求MAC地址,FF:FF:FF:FF:FF:FF广播发送数据包,只有正确的MAC地址会响应
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 轨 道 兔!
评论