目录
TCP/IP 是互联网的基础, TCP代表传输控制协议,IP代表互联网协议。目前有两个版本IP,一个是32位地址的IPv4 和一个是128位的 IPv6 。而IPv4 是现如今使用最多的IP版本,也是这次讨论的重点。
一、IP主机和IP地址
每一个注意由一个32位的IP地址来标识。为了方便起见,通常用32位的IP低质号用记点法标识例如:134.121.64.1 也可以用主机名标识如 dns1.eec.wsu.edu 。实际上应用程序通常使用主机名而不是IP地址。因为给定其中一个,我们都可以通过dns(域名系统)服务器找到另外一个,两者之间可以相互转换。
IP地址分为两部分 NeiworkID 和 HostID 字段。其中,IP 可以分为A~E类。例如B类IP分为一个16位NeiworkID,前两位是10 。发往UP地址的数据包首先被发送到具有相同networkID的路由器默认IP地址位127.0.0.1.
二、IP数据包格式
IP数据包由IP头、发送方IP地址、接收方IP地址和数据组成。每个IP数据包的大小最大为64K。IP头包含有关数据包的信息。内容如下:
IP主机可能距离很远通常不可能从一个主机直接向另一个主机发送数据包。路由器是转发数据包的特殊IP主机,它可以向普通IP主机和其他路由器发送数据包,
三、TCP/IP在网络中的数据流
应用层的数据被传到传输层会添加TCP 或者UDP包头来标识使用的传输协议。合并后的数据被传到IP网络层,添加一个包含IP地址的IP报头来标识发送和接收主机。然后合并后的数据传递到网络链路层,再次将数据分成多个帧,添加发送和接收网络的地址,用于在物理网络之间的传输。
四、套接字编程
服务端socket的就像插座,有n 个插孔可以对外提供服务。而服务逻辑由服务器内部实现,而客户端不必去关心。客户端socket就像插头,需要主动连接服务器才可以相互交流。而在计算机网络中,ip地址可以对应一台主机,而服务器主机上由多个在运行的程序,为了区分这些进程就必须通过接口来区分,同一个主机下的同一个接口只对应一个主机下的进程。
因此整个流程就是,
1.服务器就要创建一个Socket对象,而后用本机ip和接口与当前的程序进行绑定。开启监听查看是否有客户端请求连接。等待直到获取客户端的请求(对应一个文件描述符)
2.此时有客户端需要连接服务器,因此客户端首先要创建一个Socket对象指定要连接的具体内容,而后利用connect() 与服务器建立连接。
3.服务器监听到了客户端的请求,便可以利用 accept接受该客户端对应的连接进行通信,同时得到用于通信的文件描述符。
4.客户端与服务器不断请求和响应数据,直到客户端断开连接。
5.服务器端发现客户端的连接断开,服务器也跟着关闭通信的文件描述符。
6.客户端通信结束,服务器监听新的客户端请求。
在 netdb.h 和 sys/socket.h中有套接字的地址结构定义
struct sockaddr_in {
sa_family_t sin_family; //TCP/IP网络的sin_family 始终设置为AF_INET
in_port_t sin_port; //包含网络字节顺序排列的端口号
struct in_addr sin_addr ; //按网络字节顺序排列的IP地址
}
struct in_addr{
unit32_t s_addr; //按网络字节顺序排列的IP地址
}
服务器套接字编程步骤如下
- 创建socket;
- 绑定socket和端口号;
- 监听端口号; (UDP省略)
- 接收来自客户端的连接请求;(UDP省略)
- 从socket中读取字符;
- 发送消息回客户机。
客户端套接字编程步骤如下
- 创建socket;
- 连接指定计算机的端口; (UDP省略)
- 向socket中写入信息;
- 从服务器接收消息。