1.引出问题

与www.baidu.com建立连接

1
exec 9<> /dev/tcp/www.baidu.com/80

任何程序都有IO(fd为文件描述符,可以理解为Java中的new出来的File变量)

图中fd9u的连接是由内核建立的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的三次握手、四次分手?

  • 三次握手:

    1. S处于监听状态,此时C发送一个数据包syn(由传输控制层发送)到S;
    2. S收到C发送的数据包syn后,返回一个数据包syn+ack
    3. 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进行对比:

  1. 若需要连接的ip为局域网内的ip,则ip和路由表的第一条数据的子网掩码进行与操作,其结果在上图的路由表中的destination中找到了,所以不需要走网关,即网关为0.0.0.0,直连;
  2. 若需要连接的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地址会响应