背景
这篇是unix网络编程的学习笔记。
ip层协议,无连接,不可靠。所以必须依赖上层协议实现连接和可靠,比如tcp。
连接指建立连接,可靠指基于连接的通信才是可靠的。比如,udp,就不需要建立连接,它只管发送数据,有没有收到不管,所以也说它不可靠,只要没有建立连接通信,就是不可靠。**可是,不建立连接怎么通信呢?**特别注意,这里说的不建立连接,不是真的不建立连接,而是建立的连接是一次性的,不是长期关系,长期连接,比如tcp是长期连接长期通信,只要不主动close()就可以一直通信。而udp不行,udp只管建立连接,发送数据,然后连接结束。udp创建连接也是创建socket,这个都是一样的,不同的传输层协议包括tcp udp icmp都是通过创建套接字来实现的,只不过不同的参数选项而已。

ip层只负责源地址和目的地址,还有数据。ip路由协议的主要目的是路由数据。
可靠
可靠性包括几点
1.无差错
2.按顺序
3.不重复

ip数据报文
最重要的字段
1.数据
2.源地址
3.目标地址
重点关注前面三个字段。
4.数据的大小
就是整个报文的数据大小。知道大小,读数据的时候就知道什么时候结束。
5.唯一标识符
唯一标识该数据报文。因为可能重复,所以写读的时候根据这个要去重。
6.协议
最常见的是tcp还是udp。
还有icmp(internet control message protocol网络控制消息协议),比如ping telnet traceroute等,使用的就是icmp协议。
知道了我们需要哪几个核心字段,再来看ip协议的细节是怎么包含这几个核心字段的。ip数据报文,包括两部分:
1.头
2.数据
头就是和http请求头/响应头一样,属于协议的格式部分,有了这些字段,才能识别是什么协议。
头字段的图

对头字段的图的说明,总共包括两部分:
1.固定字段
2.选项字段
固定字段总共占20个字节,上图的每一行是32位(即占4个字节),总共5行,所以总共刚好是20个字节。
选项长度不固定,最大值是40个字节。因为固定字段里有个长度字段限制了头的总长度。
当然,还有一部分,就是数据本身,这个不提略过。
icmp协议
是传输层协议,和tcp udp同层级。
报文格式

作用
用于确定两台机器是否可以通信,如果不能通信,是因为哪些原因。
报错信息如图

imcp协议如何通信?
也是套接字,不过是原始套接字,你就记住是两套机制,虽然都是套接字。但是,使用的时候差不多,创建原始套接字的时候,只是参数不同,有个字段标识这是原始套接字。
原始套接字用于ping程序,不需要端口,相当于是两台机器操作系统之间的通信,而不是某个具体的程序,所以不需要端口。
参考
unix网络编程