第十三章学习笔记
TCP/IP和网络编程
TCP/IP协议
具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群
- 互联网进行通信时,需要相应的网络协议,TCP/IP 原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是 TCP/IP,TCP/IP 就是互联网的协议。
IP主机和IP地址
主机是支持TCP/IP协议的计算机或设备。每个主机由一个32位的IP地址来标识。为了方便起见32位的IP地址号通常用点记法表示,例如:134.121.64.1,其中各个字节用点号分开。
主机也可以用主机名来表示。实际上,应用程序通常使用主机名而不是IP地址。在这个意义上说,主机名就等同于IP地址,因为给定其中一个,我们可以通过DNS(域名系统)(RFC1341987RFC10351987)服务器找到另一个,它将IP地址转换为主机名,反之亦然。
IP地址分为两部分,即NetworkID字段和HostID字段。发往IP地址的数据包首先被发送到具有相同networkID的路由器。路由器将通过HostID将数据包转发到网络中的特定主机。每个主机都有一个本地主机名。localhost默认IP地址为127001。本地主机的链路层是一个回送虚拟设备,它将每个数据包路由回同一个localhost。
- 这个特性可以让我们在同一台计算机上运行TCP/IP应用程序而不需要实际连接到互联网。
IP协议
IP,在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守 IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。
IP数据包格式
版本号( 4bit ): 指P 协议版本。并且通信双方使用 的版本必须一致,目前我们使用的是IPv4,表示为 0100首部长度 (4) : IP 数据包的包头长度 (不包括数据)
优先级与服务类型(8):该字段用于表示数据包的 优先级和服务类型。通过在数据包中划分一定的优先 级,用于实现 QOS(服务质量)的要求。
总长度( 16): IP 数据包的总长度,最长为 65535 字 节,包括包头和数据标识符 ( 16): 该字段用于表示IP 数据包的标识符。
当P 对上层数据进行分片时,它将给所有的分片数据 分配一组编号,然后将这些编号放入标识符字段中,保证分片不会被错误地重组标识符字段用于标志一个数据包,以便接收节点可以重组被分片的数据包标志(3) : 和标识符一起传递,指示不可以被分片 或者最后一个分片是否发出( 完整)段偏移量 ( 13 ): 在一个分片序列中如何将各分片连接起来,按什么顺序连接起来
TTL ( time to live )生命周期(8): 可以防止一个数包在网络中无限循环的转发下去,每经过一个路 由器-1,当 TTL 的值为 0时该数据包将被丢弃 0-255
协议号 (8): 封装的上层哪个协议,ICMP:1 TCP:6 UDP:17首部校验和( 16 ):这个字段只检验数据报的首部,不包括数据部分。这是因为数据报每经过一次路由 器,都要重新计算一下首部验和 (因为,一些字段 如生存时间、标志、片偏移等可能发生变化)。
源地址 (32 ) : 源ip 地址,表示发送端的IP 地址
目标地址 (32):目标ip 地址,表示接收端的1P 地址 可选项:选项字段根据实际情况可变长,可以和IP一起使用的选项有多人。例如,可以输入创建该数据包 的时间等。在可选项之后,就是上层数据.
UDP/TCP
- UDP(用户数据报协议)在IP上运行,用于发送/接收数据报。与IP类似,UDP不能保证可靠性,但是快速高效。ping是一个向目标主机发送带时间戳UDP包的应用程序。接收到一个pinging数据包后,目标主机将带有时间戳的UDP包回送给发送者,让发送者可以计算和显示往返时间。如果目标主机不存在或宕机,当TTL减小为0时,路由器将会丢弃pinging UDP数据包。在这种情况下,用户会发现目标主机没有任何响应。用户可以尝试再次ping,或者断定目标主机宕机。
- TCP(传输控制协议)是一种面向连接的协议,用于发送/接收数据流。TCP也可在IP 上运行,但它保证了可靠的数据传输。通常,UDP类似于发送邮件的USPS,而TCP类似于电话连接
端口编号
应用程序=(主机IP,协议,端口号)
套接字 API
- int套接字(int域,int类型,int协议)
新创建的套接字没有任何相联地址c它必须与主机地址和端口号绑定,以识别接收主机或发送主机:这通过bind系统调用来完成。 - int bind(int sockfd, struct sockaddr *addr, socklen_t addrlen)
bind()系统调用将addr指定的地址分配给文件描述符sockfd所引用的套接字addrlen 指定addr所指向地址结构的大小(以字节为单位)。对于用于联系其他UDP服务器主机的UDP套接字,必须绑定到客户机地址,允许服务器发回应答。对于用于接收客户机连接的TCP套接字,必须先将其绑定到服务器主机地址。 - UDP套接字使用scndto()/recvfrom()来发送/接收数据报。
TCP套接字
在创建套接字并将其绑定到服务器地址之后,TCP服务器使用listen()和acccpt()来接 收来自客户机的连接
int Iistcn(int sockfd, int backlog);
listen()将sockfd引用的套接字标记为将用于接收连入连接的套接字。backlog参数定义了等 待连接的最大队列长度。
int accept(int sockfd, struct sockaddr *addr, sockien_t *addrlen);
accept()系统调用与基于连接的套接字一起使用。它提取等待连接队列上的第一个连接请求 用于监听套接字sockfd,创建一个新的连接套接字,并返回一个引用该套接字的新文件描 述符,与客户机主机连接。在执行accept()系统调用时,TCP服务器阻塞,直到客户机通过 coimectO建立连接。
苏格拉底挑战
TCP\IP协议
TCP套接字
chatgpt
TCP/IP 协议族
TCP套接字
代码
server
client