- 1、本文档共19页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
段景山 网络软件设计 建立连接与 接口设计 制作 主讲 段景山 * 引入 回到面向连接服务器的基本流程 在调试状态下发现一个现象 引入:accept( )的作用 s = socket( ); bind(s,…); listen(s , 5); while( 1 ){ ss = accept( s,… ); recv( ss, buf1 ,…); send( ss, buf2,… ); …… closesocket( ss ); } s = socket( ); retval = connect( s , …); if( retval != 0 ){ deal with the error } goto END; send( s, buf1,…); recv( s, buf2,…); …… closesocket( s ); 发生在listen(),connect()和accept()之间的故事 * * TCP连接建立时序 时序 客户机 服务器 SYN SYN+ACK ACK * 深入建立连接过程 回顾 套接口结构中的四个重要队列 so_q0: 正在该端口建立连接的套接口队列 so_q: 连接已建立的套接口队列,用户调用accept时,从队列中取出并将新的套接口返回给用户使用 struct socket{ short so_type; short so_state; …… struct socket *so_q0; struct socket *so_q; struct sockbuf so_rcv, struct sockbuf so_snd; …… } * 深入建立连接过程 1、当服务器程序调用listen( s )后, s,主套接口进入listen状态,可以接受用户的SYN请求 2、当客户机调用connect( )后,向服务器发出SYN请求 3、TCP实体收到SYN后,创建一个从套接口ss,并挂在s的so_q0队列 so_q0 本地端口:1234 so_q s state:LISTEN 远端口:/ S:5678 TCP报文 D:1234 SYN so_q0 本地端口:1234 so_q ss state:LISTEN 远端口:/ 4、TCP实体发出SYN ACK,并继续与对方的TCP实体完成三次握手过程。从套接口ss进入ESTABLISH状态,并挂在主套接口的so_q队列中。 5、服务器程序调用ss = accept( s ),从s的so_q队列中取出一个已建立连接的套接口,并返回该套接口的标识符 SYNRCV 5678 S:5678 TCP报文 D:1234 ACK ESTABLISH S:1234 TCP报文 D:5678 SYN ACK accept() * 服务器套接字的一瞬 so_q0 本地端口:1234 so_q s state:LISTEN 远端口:/ so_q0 本地端口:1234 so_q ss state:SYNRCV 远端口:5678 so_q0 本地端口:1234 so_q ss state:SYNRCV 远端口:4321 so_q0 本地端口:1234 so_q ss state:ESTABLISH 远端口:2143 so_q0 本地端口:1234 so_q ss state:ESTABLISH 远端口:1111 (1234) 用户 TCP 服务器在主套接字上可以不断接收连接 * 深入建立连接过程 回到实验 发现一个现象 证明了so_q0队列与listen(,x)之间的关系 * 深入建立连接过程 问题:下列关于accept()和连接建立的关系描述正确的是: A、 不调用accept()就不能建立连接 B、 由accept()调用建立 C、 连接可能在accept()之前就已经建立 D、 连接可能在accept()阻塞期间建立 问题:listen()限制的连接个数是? 在so_q0和so_q队列上排队的套接字数量 so_q0和so_q队列长度 * 深入连接建立过程 如何证明连接在accept之前就可以建立 实验方案 观察Socket状态 截获双方交互的报文,观察三次握手过程 如果连接已经建立,则客户机可以向服务器发送数据 实验结论 Socket状态为“ESTABLISHED” 三次握手的报文均可截获 客户机可以向服务器发送数据 验证 * 服务原语时序图 connection_req() connection_ind() connection_resp() connection_conf() SYN SYN+ACK ACK data_req() data_ind() data_req() data_ind() disc_req() disc_ind() FIN
文档评论(0)