- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
教案
教学专题 授课学时 教学章节 授课对象 教学类型 授课形式 教学重点 教学难点 教学内容
和
教学目标 知识点 学习要求 了解 理解 掌握 熟练掌握 TCP套接字编程基本步骤 TCP套接字编程基本函数 例程讲解 教学过程 教学提示 媒体使用 课后导读 教学后记
讲稿
教学内容 教学设计 3.1 TCP套接字编程
使用TCP套接字可以实现基于TCP/IP协议的面向连接的通信,分为服务器端和客户端两部分。
TCP套接字编程基本函数
3.1.1 socket()函数
#include sys/socket.h
int socket(int family, int type, int protocol)
返回:非负套接字(sockfd)-成功;-1-出错。
family:协议族; type:套接字类型;
protocol:一般为0,除原始套接字外。
family type
AF_INET IPv4协议 SOCK_STREAM 字节流套接口
AF_INET6 IPv6协议 SOCK_DGRAM 数据报套接口
AF_LOCAL unix域协议 SOCK_RAW 原始套接口
AF_ROUTE 路由套接口
AF_KEY 密钥套接口
3.1.2 connect()函数
#include sys/socket.h
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
返回:0-成功;-1-出错;
函数connect激发TCP的三路握手过程;仅在成功或出错返回;错误有以下几种情况:
如果客户没有收到SYN分节的响应(总共75秒,这之间需要可能需要重发若干次SYN),则返回ETIMEDOUT。
如果对客户的SYN的响应是RST,则表明该服务器主机在指定的端口上没有进程在等待与之相连。函数返回错误ECONNREFUSED;
如果客户发出的SYN在中间路由器上引发一个目的地不可达ICMP错误,客户上的内核保存此消息,并按第一种情况,连续发送SYN,直到规定时间,返回保存的消息(即ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程。
3.1.3 bind()函数
#include sys/socket.h
int bind(int sockfd, const struct sockaddr *addr, socklen_len len)
返回:0-成功;-1-出错并置errno
该函数指明套接字将使用本地的哪一个协议端口进行数据传送(IP地址和端口号)。
注意:协议地址addr是通用地址。
Len是该地址结构(第二个参数)的长度。
一般而言,服务器调用此函数,而客户则很少调用它。
绑定地址时,可以指定地址和端口号,也可以指定其中之一,甚至一个也不指定。
通配地址:INADDR_ANY,其值一般为0,它通知内核选择IP地址。
若指定端口号为0,调用函数bind时,内核选择一个临时端口(在实际中,端口号都要指定);但若指定一个通配IP地址,则直到套接字已连接(TCP)或数据报已在套接字上发出(UDP),内核才选择一个本地IP地址。应用程序可在bind()后用getsockname()来获知所分配的地址,但必需注意的是,getsockname()只有在套接口连接成功后才会填写Internet地址,这是由于在多种主机环境下若干种Internet地址都是有效的。
#include sys/socket.h
int listen(int sockfd, int backlog)
返回:0-成功;-1-出错并置errno值;
函数listen仅被服务器调用,它完成两件事情:
函数listen将未连接的套接字转化成被动套接字,指示内核应接受指向此套接字的连接请求;
函数的第二个参数规定了内核为此套接字排队的最大连接个数;
对于给定的监听套接字,内核要维护两个队列:1是未连接队列 2是已连接队列
当客户端连接服务端时先在未连接队列里面建立一条记录,等tcp三次握手完成后把记录从未连接队列中移到已连接队列。
两个队列之和不超过backlog;
backlog设置过大必然也会带来开销,主要包括队列的空间开销。较大的backlog容易引起SYN flood攻击!backlog队列位于nonable的内存中,SYN flood会消耗大量的空间。
CP的三次握手是怎么进行的:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行
原创力文档


文档评论(0)