此篇文章发布距今已超过1天,您需要注意文章的内容或图片是否可用!
大多数用户并不熟悉电话背后的工作原理,但是并不妨碍打电话。
拿起话机,拨电话号码,振铃,对方摘机,电话连接成功建立,语音双向传输,挂机,电话连接断开。这就是电信局给用户提供的用户接口,简单易用,对吗?但是背后的信令工作原理并不简单,SS7、ISUP、H.323、H.225、H.245、MGCP、SIP、SIP-T,E3/T3。地球上99.99%+的用户无需知道这些技术细节,每天使用电话毫无压力。如果用户一定要熟悉原理才能打电话,这项技术估计也流行不起来,为什么?国际电信联盟将电话背后的原理细节屏蔽了,或者说封装起来了,用户看不到。用户能看到的就是电话号码。TCP协议源码极其复杂,如果将TCP_Output(发送)、TCP_Input(接收)、直接暴露给编程用户,则用户需要提供很多复杂的入口参数(input augument)。而要传入正确的入口参数,用户需要对TCP/IP复杂的struct、链表、指针非常精通。如果编程用户一定要精通TCP/IP源码才能编程,这项技术也流行不起来,为什么?TCP/IP源码的设计者,将TCP内部的协议实现细节封装起来让编程用户看不到,用户能看到的就是Socket。Socket就如同电话号码一样的存在,它是操作系统内核分配一个整数型的数字而已。TCP就如同电话网络用户看不到的信令部分,是真真正正用于建立/释放连接的协议。TCP常用的Socket接口无非Socket、Bind、Listen、Connect、Accept、Send、Receive等,尽管它们的名字绚丽多彩,彰显个性,但是它们最后都要调用一个统一的接口:它们的个性与不同,表现在“req” 这个整数的不同,以及第3、第4、第5个参数的不同。是谁取决于用户在创建socket ‘so’时,使用的proto是:(*prp->pr_usrreq)(so, PRU_ATTACH,(struct mbuf *)0, (struct mbuf *)proto, (struct mbuf *)0);如果用户创建TCP Sokcet,则需要在上面的proto mbuf里填入“SOCK_STREAM”。上文的抽象的函数指针(*prp->pr_usrreq)将指向tcp_usrreq。tcp_usrreq(so, PRU_ATTACH,(struct mbuf *)0, (struct mbuf *)proto, (struct mbuf *)0);公众号文章看到关于TCP协议的内容,才是TCP协议本身,主要表现在tcp_output、tcp_input。来自用户Socket的请求,TCP/IP将封装的抽象慢慢地具体化,表现为pr_usrreq、tcp_ usrreq、tcp_output、ip_output、if_output,最后由接口物理层发送出去。返程的流量packet,被物理接口以及driver函数被放入ipintrq(IP层input queue),产生中断调用ipintr,根据protocol==6(TCP),调用tcp_input、然后依据TCP 4元组映射PCB,通常PCB指向Socket的指针,找到Socket,并最终找到Socket Input buffer,将Packet放入Input buffer,等待与Socket关联的用户进程取走并处理。最后,一个TCP Socket,对应一个TCP连接,严格意义上的一一映射。 推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
ZhouSa.com-宙飒天下网
还没有评论,来说两句吧...