UNIX网络环境配置,网络编程学习前7章小结

前言

这一周开始学习UNIX网络编程了,虽然这一周项目的压力很大,不过最后还是顶住了压力,尽量平衡了实验室工作和自主学习。

不过话虽这么说,毕竟还是有一周的时间基本没怎么学习了,看我的博客发表日期就知道了,少了一篇。

好了,进入正文吧。

第一章:简介和TCP/IP

这一章一开始就展示了一个时间获取客户端程序和服务器端的程序。学过了linux程序设计之后,这部分的代码我已经可以直接看懂,也很容易的就自己编程完成了开发。不过编译的时候却出了问题。我在网上下载了该书的源码,发现加入的unp.h并不能使用,原来是这个头文件里面定义了特别多的包裹函数,即是包含了错误处理的函数。一番折腾之后,编译出了libunp.a的库文件,修改好了重定义。然后就成功的编译完成了第一个程序。并且在自己linux主机上完成了试验。


第二章:传输层:TCP、UDP和SCTP

这一章也主要是几个协议的简介,初步了解TCP,UDP,以及SCTP之间的区别,这些知识我在大学本科的时候已经学过一遍了,现在在复习了一次,所以看起来的速度还是挺快的。

最重要的TCP三次握手和4次握手终止也再复习了一次。比较重要的新知识就是TCP状态转换图了。特别是在主动关闭那端的TIME_WAIT状态,停留2个MSL长度,来保证网络中遗留的连接分节全部消失,避免新的连接接收到这些老的数据。

其他各种状态用的也非常的多,36页的TCP状态图也经常翻回来看。


第三章::套接字编程简介:

第一部分讲述的内容是套接字地址结构,现在用的是ipv4和ipv6,还有一些其他的unix上的结构,大体上就包括三个部分,sin_family, sin_port, sin_addr三个部分,ipv6的在为sin6。并且有一个通用的套接字结构,sockaddr_storage,在不确定地址的时候可以使用这个。字节排序函数用来统一网络上的字节序,避免不同的主机读取到消息后产生不同的判断。常用的函数有四个。

地址转换函数有inet_pton和inet_ntop是两个新的,ipv4和ipv6都适用的字符串转换ip地址的函数。以后的代码中尽量都使用这个新的函数。


第四章:基本的TCP套接字编程

到了这一章,总算是涉及了编程了。过程还是与之前的学习相同的,socket函数生成套接字,bind函数绑定套接字与ip和端口,listen函数改变套接字为监听模式。connect函数连接套接字,accept函数返回新的用于通信的套接字。

在这里新学到的知识就是明白了bind函数到底是用来干嘛的,之前的学习只说给套接字命名,但是不明白有什么作用,客户端可以不调用bind函数直接调用connect函数,这样系统内核就会自动给客户端的套接字分配一个ip和端口号,然后用这个ip和端口号与服务器通信,那么服务器可以不调用bind函数吗?想想就明白不可能了,因为如果服务器的ip和端口号是随机分配的,那么客户端怎么知道去连接哪一个端口号和ip呢。并且通配地址也不是指任何地址,而是由内核分配地址的。

listen函数会把创建的默认主动套接字改成被动套接字,第二个参数就是可以未完成队列和已完成队列的总数和了,不一定等于第二个参数的值,取决于系统的实现。并且在listen阶段就会和客户端完成3次握手,完成之后就进入了已完成队列了,等待accept函数的调用。

accept函数可以得到客户的ip和端口,并且返回可以与客户进行通信的sockfd,然后就可以开始通信。

服务端可以在接收到一个新的客户端请求之后调用fork函数和exec函数来建立多进程服务客户端。

最后完成了通信之后,调用close函数关闭套接字,如果关闭的是最后一个对套接字的引用时,会主动发送一个FIN信号。

getsockname与getpeername可以用来获得本地或者客户端的IP地址和端口号,一般用在子进程处理中。


第五章:TCP客户/服务器端程序实例

这一章列出了最简单的服务器与客户端程序,实现的功能就是客户端输入,服务器端回射,然后在此基础上讨论各种可能在通信过程中出现的问题。不过介于我使用的时候只能在本地上做实验,有一些情况并没能亲自测试一次。

程序运行之后调用netstat -a可以查看到端口与ip地址对应的网络状态。

正常终止的时候,输入ctrl+D就可以发送一个EOF,read调用将会返回一个0,代表到达了文件末尾了。客户端先关闭了套接字,因此会发送一个FIN给服务器端,服务器端收到EOF之后也会关闭套接字,因此发送终结连接的最后两个分节,服务器端到客户端的FIN和客户端到服务器的ACK。然后客户端进入TIME_WAIT状态,直到所有的分节都在网络中消失。

然后是关于子进程结束的信号处理,使用wait函数与waitpid函数,又有阻塞和非阻塞之分,这些内容在学习linux程序设计的时候基本已经学习到了,所以不是特别大的问题。

之后便是各种连接可能遇到的问题,accept之前收到RST信号的处理取决于各个系统的实现,所以基本上没有一个确定的答案。 服务器端关闭的时候,如果sockfd被关闭了,那么会主动发送一个FIN给客户端,客户端然后返回一个ACK,但是这时连接还没有终止,除非客户端收到FIN之后主动关闭套接字,才会完成四次握手,关闭连接,此时客户端还是可以继续往套接字里写数据的,不过由于服务器已经奔溃,所以服务器端回返回一个RST信号回来。客户端在调用玩write函数之后调用read,会由于之前收到的FIN信号立刻返回一个EOF,然后结束进程。

如果上述的情况下,客户端不管收到的RST信号,继续往套接字里写,那么内核会发送一个SIGPIPE信号给进程,默认终止进程。

服务器端奔溃,不会发送FIN信号,因此客户端什么也不会收到。客户端发送给服务器端的消息不会收到ACK,或者客户端阻塞在read调用之上,最终会导致timeout错误或者unreachable错误。

如果服务器奔溃后重启了,那么客户端发送的消息会返回一个RST信号。

数据格式是在网络中传输的一个重要问题,由于字节序的问题,所以在不同机器上传递数据是有风险的,不一样的结构会导致传递错误,所以就有了http超文本协议,传递字符串是一定不会出错的。


第六章:IO复用:select函数和poll函数

这一章主要讲诉的是IO模型,有5种基本的模型:

阻塞式IO,非阻塞式IO,IO复用, 信号驱动式IO, 异步IO。

最常用的就是前三个了,信号驱动式io在描述符就绪时,内核会发送SIGIO通知我们。异步IO是使用的非常少的。

使用select函数和poll函数可以完成IO复用,调用的时候阻塞在select函数上,直到有一个文件描述符可用,然后才返回可用的个数。使用宏定义FD_ISSET来测试该描述符是否是可用的描述符。调用select函数的第一个参数maxfdp1是所有描述符里最大值加一,所以用起来会有一些不方便,但是熟悉了之后不是问题。

shutdown函数可以只关闭RD或者WR部分,关闭WR部分时会主动发送一个FIN,不用等到所有的文件描述符都关闭。但是这部分里有一个问题我没能解决,就是重定向文件给stdin,我试了几次都失败了,暂时没有找到解决的办法。


第七章:套接字选项

这一部分就是特别理论的部分了,不过还好我之前本科的学习还记得不少,所以大部分的知识没有花费太多的力气就了解了,只是可能真的记不住,选项主要使用setsockopt函数与getsockopt函数来设置与获取。唯一有些头疼的部分就是值-结果参数了,这个参数主要是用来描述内核与进程通信时使用的参数的,重点就是需要传输结构的大小参数。在设置和获取套接字选项的时候,获取参数的数据结构是不同的,这一部分理解了就没有问题了。

其他的选项有些比较重要,看一遍的时候理解,不过估计过不了多久久会忘记,所以这一部分应该以后会需要常常回来复习的。

我学习完之后直观感觉,常用的应该是这些:SO_KEEPALIVE, SO_LINGER, SO_REVBUF, SO_SNDBUF, SO_REUSEADDR, SO_REUSEPORT, TCP_NODELAY。学完感觉差不多就是这些了。以后其他的 需要的时候再回来看就行了,

总结

这一周的学习让我感觉到我的速度应该可以变快更多,不过由于最近忙于考试和项目,没有更多的时间花在这里了,只能暂时保持这个进度前进吧。东西不难,我希望能学到更多,更快。课后的习题我尝试去做了,基本都很简单,希望这代表我都已经学明白了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 言 第一部分 电子邮件 第1章 电子邮件概述 1 1.1 用户网络地址 1 1.1.1 Internet域寻址方式 2 1.1.2 UUCP路径寻址方式 3 1.2 发送和接收邮件 3 1.3 收到邮件的通知 4 1.4 自动接收邮件 5 1.5 二进制邮件和档案文件 5 1.5.1 编码二进制 6 1.5.2 MIME 7 1.6 在线通信:write和talk 7 1.6.1 直接连接: write 8 1.6.2 交互通信:talk 9 第2章 电子邮件程序mailx 10 2.1 发送信件 10 2.1.1 标准输入及重定向 10 2.1.2 给多个用户发送同一封信件 11 2.1.3 拷贝信件内容到一个文件里 12 2.1.4 采用tilde命令编辑信件 12 2.2 接收信件 15 2.2.1 信件列表符及当信件标记 符 16 2.2.2 显示信件 17 2.2.3 信件的删除及恢复删除 18 2.2.4 回复信件和发送新信件 19 2.2.5 退出邮件shell 20 2.2.6 在邮箱文件里保存和访问 信件 21 2.2.7 在文件里保存信件内容 23 2.3 mailx别名、选项及邮件初始化文 件 24 2.3.1 mailx别名 24 2.3.2 mailx选项 24 2.3.3 管理邮箱文件 26 第3章 电子邮件程序Elm 28 3.1 使用Elm发送信件 28 3.2 使用Elm接收信件 30 3.3 退出Elm程序 32 3.4 删除信件与恢复删除信件 32 3.5 回复信件 33 3.6 发送新信件 33 3.7 保存信件 33 3.8 读取邮箱文件 34 3.9 Elm别名 35 3.9.1 别名菜单 35 3.9.2 .elm和aliases.text 36 3.10 Elm选项 36 3.11 Elm命令小结 37 第4章 电子邮件程序MH 39 4.1 使用MH发送信件 39 4.2 使用MH接收信件 40 4.3 使用MH显示信件 41 4.4 指定MH信件 41 4.5 打印、保存和回复信件 42 4.6 删除信件 43 4.7 选择信件 43 4.8 使用信件夹 45 4.9 在邮件脚本里使用MH 46 4.10 MH命令小结 46 第5章 Pine 48 5.1 撰写和发送信件 49 5.1.1 填写信件头 50 5.1.2 编辑信件正文 51 5.1.3 Pine地址簿 52 5.2 接收信件 53 5.3 选择信件夹 56 5.3.1 信夹集合 57 5.3.2 新闻组 58 5.4 Pine附件 59 5.5 Pine配置 61 5.6 Pico和Pilot 65 第二部分 新闻阅读器 第6章 Usenet及新闻阅读器:rn 和 readnews 67 6.1 发布文章:Pnews 68 6.2 .signature文件 70 6.3 新闻阅读器rn 70 6.3.1 新闻组列表 70 6.3.2 文章列表 72 6.3.3 显示文章 74 6.3.4 保存文章 74 6.3.5 标记文章 76 6.3.6 文章选择 76 6.3.7 答复文章:跟随文章和信件 77 6.3.8 rn选项 79 6.4 新闻阅读器readnews 81 6.5 小结 83 第7章 新闻阅读器trn 84 7.1 trn的新闻组界面 84 7.2 trn选择器 86 7.3 选择器显示模式:文章、主题和 线索 89 7.4 查找文章 91 7.5 显示文章 92 7.6 标记文章 94 7.7 回复文章 95 7.8 保存文章 95 7.9 trn线索树 96 7.10 trn选项 99 7.11 查补代码 100 7.12 trn环境变量 102 7.13 trn宏 103 7.14 小结 104 第8章 tin和nn 新闻阅读器 105 8.1 tin新闻阅读器 105 8.2 tin 新闻组选择屏幕 105 8.3 新闻组索引屏幕 108 8.4 tin线索列表 111 8.5 tin文章阅读器 112 8.6 tin文章过滤 114 8.7 tin命令行编辑和历史 116 8.8 tin配置 116 8.8.1 tin文件 117 8.8.2 tin 选项 117 8.8.3 tin配置变量:tinrc 118 8.8.4 环境变量 122 8.8.5 新闻组属性 123 8.9 nn新闻阅读器 125 第三部分 网络及Internet工具 第9章 TCP/IP网络互联技术 129 9.1 TCP/IP协议 129 9.2 域名 130 9.3 Internet和Intranet 131 9.4 TCP/IP地址 132 9.5 TCP/IP网络地址 133 9.6 TCP/IP 配置文件 134 9.6.1 标识主机名文件:/etc/hosts 134 9.6.2 网络名文件:/etc/networks 135 9.6.3 主机名文件:/etc/hostname 135 9.6.4 域名服务(DNS)文件: /etc/ host.conf和/etc/resolv.conf 136 第10章 Telnet 137 10.1 Telnet连接 137 10.2 公共服务 138 10.3 Telnet命令 139 10.4 Telnet配置 142 10.5 Telnet的.telnetrc文件 143 第11章 FTP 144 11.1 FTP连接 144 11.2 FTP目录和文件命令 145 11.3 文件传输 148 11.4 代理FTP 152 11.5 匿名FTP 152 11.6 自动登录 155 11.7 FTP宏 156 11.8 文件名的映射和转换 157 11.9 FTP传输参数 158 11.10 tar档案文件 159 11.11 压缩文件 160 11.11.1 compress、uncompress和 zcat 160 11.11.2 gzip、gunzip和gzcat 161 11.11.3 zip和unzip 161 第12章 Archie和WAIS 164 12.1 Archie 164 12.1.1 Archie客户软件 164 12.1.2 Archie服务器 166 12.2 WAIS 170 12.2.1 freeWAIS 171 12.2.2 WAIS服务器 171 第13章 Gopher 176 13.1 Gopher菜单 176 13.2 Gopher书签 178 13.3 Veronica 180 13.4 Gopher配置文件 181 13.5 Gopher服务器 183 13.5.1 Gopher目录 184 13.5.2 Gopher索引 186 13.5.3 一个Gopher站点的例子 186 第14章 World Wide Web 189 14.1 URL地址 189 14.2 Web页面 192 14.3 Web浏览器 193 14.3.1 Netscape Communicator 193 14.3.2 Mosaic 195 14.3.3 Lynx 195 14.4 Java 197 14.5 超文本标记语言HTML 197 14.5.1 标题和列表 200 14.5.2 访问Internet资源 202 14.5.3 Web页面示例 203 14.5.4 图像和声音 205 14.5.5 表单和公共网关接口 207 第四部分 远程访问 第15章 TCP/IP远程访问操作 211 15.1 网络信息检测命令:rwho、 ruptime和ping 212 15.2 远程访问权限文件:.rhosts 212 15.3 远程登录命令:rlogin 213 15.4 远程文件拷贝命令:rcp 213 15.5 远程执行命令:rsh 214 第16章 UUCP 216 16.1 UUCP的寻址方式 216 16.2 显示连接系统命令:uuname 218 16.3 UUCP连接管理命令:uucico 和uuxqt 218 16.4 UUCP命令 219 16.5 文件传输命令:uuto和uupick 219 16.6 文件拷贝命令:uucp和uustat 221 16.7 远程执行命令:uux 222 16.8 远程登录命令:cu和ct 223 Unix术语 226

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值