揭开uni网络之纱4--TCP网络传递中出现的问题--通用一个简单样例说明

TCP数据传递中出现的各种问题1正常启动首先,我们在主机linux上后台启动服务器。服务器启动后,它调用socket、bind、listen和accept,并阻塞与accept调用。在启动客户之前,运行netstat程序来检查服务器监听套接字的状态。可知:有一个套接字处于LISTEN状态,它有通配的本地IP地址,本地端口9877。Netstat用“*”来表示一个为0的IP地址(INADDR_ANY,通配地址)或为0的端口号。在同一个主机上启动客户,并指导服务器主机的IP地址为127.0.0.1(换汇地址)。客户调用socket和connect,后者引起TCP的三路握手过程。当三路握手完成后,客户中的connect和服务器中的accept均返回,连接于建立。接着发生的步骤如下:1)客户调用str_cli函数,该函数将阻塞与fgets调用,因为我们还未曾键入过一行文本。2)当服务器中的accept返回时,服务器调用fork,再由子进程调用str_echo。该函数调用readline,readline调用read,而read在等待客户送入一行文本期间阻塞。3)另一方面,服务器父进程再次调用accept并阻塞,等待一下一个客户连接。至此,我们有3个都在睡眠(即已阻塞)的进程:客户进程、服务器父进程和服务器子进程。我们是在同一个主机上运行客户和服务器,netstat给出了对应所建立TCP连接的两行额外的输出。第一个ESTABLISHED行对应于服务器子进程的套接字,因为它的本地端口号是9877;第二个ESTABLISHED行对应于客户进程的套接字,因为它的本地端口号是42758。也可用ps命令来检查这些进程的状态和关系从输出中可见,客户和服务器运行在同一个窗口中(pts/6,表示伪终端号6)。PID和PPID列给出了进程间的父子关系。由于子进程的PPID是父进程的PID,可用看出tcpserv01行是父进程,第二个tcpserv01行是子进程,而父进程的PPID是shell(bash)。我们所有三个网络进程的STAT列都是“S”,表明进程在为等待某些资源而睡眠。进程处于睡眠状态时WCHAN列指出相应的条件。Linux在进程阻塞于accept或connect时,输出wait_for_connect;在进程阻塞与套接字输入或输出时,输出tcp_data_wait;在进程阻塞与终端I/O时,输出read_chan.这里我们的三个网络进程的WCHAN值所表示的意义一目了然。2正常终止我们键入终端EOF字符(Control-D)以终止客户。此时如果立即执行netstat命令,我们将看到如下结果:当前连接的客户端(本地端口号为42758)进入TIME_WAIT状态,而监听服务器扔在等待另一个客户连接。正常终止客户和服务器的步骤。1)当我们键入EOF字符时,fgets返回一个空指针,于是str_cli函数返回。2)当str_cli返回到客户的main函数时,main通过调用exit终止。3)进程终止处理的部分工作是关闭所有打开的描述符,因此客户打开的套接字由内核关闭。这导致客户TCP发送一个FIN给服务器,服务器TCP则以ACK响应,这就是TCP连接终止序列的前半部分。因此服务器套接字处于CLOSE_WAIT状态,客户套接字则处于FIN_WAIT_2状态。4)当服务器TCP接收FIN时,服务器子进程阻塞与readline调用,于是readline返回0,这导致str_echo函数返回服务器子进程的main函数。5)服务器子进程通过调用exit来终止。6)服务器子进程中打开的所有描述符随之关闭,由子进程来关闭已连接套接字会引发TCP连接终止序列的最后两个分节:一个从服务器到客户的FIN和一个从客户到服务器的ACK。至此,连接完全终止,客户套接字进入TIME_WAIT状态。7)进程终止处理的另一部分内容是:在服务器子进程终止时,给父进程发送一个SIGCHLD信号。3处理SIGCHLD信号3.1处理SIGCHLD信号SIGCHLD信号是由内核在任何一个进程终止时发给它的父进程的一个信号。设置僵死状态的目的是维护子进程的信息,以便父进程在以后某个时候获取,包括子进程的进程ID、终止状态以及资源利用信息(CPU时间、内存使用量等等)。僵死进程占用内核中空间,最终导致我们耗尽进程资源。添加SIGCHLD捕捉函数,程序运行为:1)我们键入EOF字符来终止客户。客户TCP发送一个FIN给服务器,服务器响应以一个ACK。2)收到客户的FIN导致服务器TCP递送一个EOF给子进程阻塞中的readline,从而子进程终止。3)当SIGCHLD信号递交时,父进程阻塞与accept调用。Sig_chld函数(信号处理函数)执行,其...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?