操作系统协议栈:
协议栈上半部有两块,分别是负责用TCP协议收发数据的部分和负责用UDP协议收发数据的部分。下半部分用IP协议控制网络包收发操作部分。在网络层传送数据时,数据会被切割成包,而将其发送到通信对象的操作就是IP负责的。
TCP一般用于什么情况:
浏览器、邮件等一般应用程序收发数据
UDP一般用于什么情况:
查询等收发较短的控制数据时
IP包含两块:
ICMP协议:用于告知网络包传送过程中产生的错误以及各种控制信息。
ARP协议:用于根据IP地址查询相关以太网MAC网址。
套接字:
套接字是网络通信的入口,在前文我们是这样理解的。但是他实际上是一个抽象的概念。套接字记录了用于控制通信操作的控制信息,例如通信对象的IP地址,端口号,通信操作的进行状态等。而协议栈在进行网络操作时,需要注意这些信息。
这是我的电脑上的套接字,每一列分别代表:协议类型,本机ip地址(0.0.0.0表示没通信),通信对象ip地址,通信状态,当前连接套接字的程序PID
连接服务器的连接是什么意思:
以太网的网线都是一直连接的状态,这里的连接显然不是这个意思。这里的连接实际上是通信双方交换控制信息,在套接字中记录一些必要信息而准备数据收发的一连串操作。
通信操作中使用的控制信息分为两类:
1.头部中的控制信息(TCP头部就存有发送方端口号,ACK号数据偏移量等)
2.套接字中的控制信息(应用程序传递来的信息以及从通信对象接收到的信息都会保存到套接字中,还有收发数据操作的执行状态等信息,协议栈会根据这些信息来执行每一步操作)。
连接具体操作:
首先浏览器调用Socket的connect方法,传入了两个重要参数,第一个是一些连接信息,第二个就是IP地址和端口号,而IP地址可以根据域名经过DNS服务器查询,而端口号则可以根据URL进行判断。有了这两个信息后,协议栈就会在TCP模块中创建一个包含表示开始数据收发操作的控制信息头部(也就是之前说的TCP头部),头部中含有客户端和服务器端的端口号,此时套接字已经能准确找到服务器那个套接字了。然后我们将TCP头部中的控制位中的SYN设置为1(表示连接,还有一些其他操作),此时TCP头部就创建好了,接下来TCP模块会将信息传递给IP模块,IP模块执行网络包发送后网络包通过网络到达服务器,服务器的IP模块会接收到数据包,并且将其转给TCP模块,TCP模块解析数据包,根据其中的信息找到套接字,然后根据解析好的信息给套接字相关属性赋值。并且把状态改为连接。都完成后服务器TCP模块会返回响应,比如将SYN设置为1(还有很多操作,比如将ACK设置为1表示接收到了,数据没丢失)。然后网络包返回到客户端,通过IP模块到达TCP模块,并且通过头部的信息确认服务器连接是否成功,若成功(SYN为1),那么将IP地址端口号状态等信息写入套接字,并且设置ACK为1表示用户接收到,并在次将数据包发送给服务器 服务器接收到发现ACK为1后连接操作完成。