网络编程之accept函数和accept函数在三次握手中的位置
accept函数实际上是在三次握手之后,具体原因请看文章结尾具体解释。
基本TCP客户端/服务器程序的套接字函数
accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接(从这不难看出accept是在三次握手之后,文章最后具体说明,已完成连接队列请转连接自行观看)。如果已完成队列为空,那么进程被投入睡眠(嘉定套接字为默认的阻塞方式)。
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
返回:若成功返回非负描述符,若出错则为-1
参数cliaddr和addrlen用来返回已连接的对端进程(客户)的协议地址。addrlen是值-结果参数:调用前,我们将由*addrlen所引用的整数值置为由cliaddr所指的套接字地址结构的长度,返回时,该整数值即为由内核存放在该套接字地址结构内的确切字节数。
如果accept连接成功,那么其返回值是有内核自动生成的一个全新描述符,代表与所返回客户的TCP连接。在讨论accept,我们称它的第一个参数为监听套接字描述符,返回值为已连接套接字描述符。区分这两个套接字分厂重要,一个服务器通常仅仅创建一个监听套接字,他在该服务器的生命周期内一直存在。内核为每个服务器进程接收的客户连接创建一个已连接套接字。当服务器完成对某个给定客户的服务时,已连接套接字就被关闭。
本函数最多返回三个值:一个既可能是新套接字描述符也可能是出错指示的整数、客户进程的协议地址以及改地址的大小。如果我们对返回客户协议地址不感兴趣,那么可以把cliaddr和addrlen均值为空指针。
accept应该位于第三次握手之后,我们来看看TCP连接过程:
初始:客户端处于CLOSED状态,而服务器端从CLOSED状态变为LISTEN状态
第一步:客户端发送一个SYN序列号
第二步:服务器端接收来自客户端的连接请求,并返回ACK+SYN
第三步:客户端接收消息,返回ACK
在第三步之后,服务器接收到消息,连接就完成了。这样就可以调用accept函数获得此连接。
accept其实也可以在第三步,原因是,此时accept函数要给此次连接分配资源,最初是想这样设计;但是,设想如果有10000甚至更多个客户端都和该服务器连接,发送SYN,服务端收到之后,这些客户端却不再理会服务端的回复,然而此时服务端的资源却都用accept()分配了。这就是所谓的“DDOS攻击”。
为了解决这个问题,accept()于是被放在三次握手之后。
当然,这样也不能保证不能被攻击,当然这是后话。
网络编程之accept函数和accept函数在三次握手中的位置相关推荐
- python中import re_Python编程之Re模块下的函数介绍
re模块下的函数 compile(pattern):创建模式对象 import re pat=re.compile('A') m=pat.search('CBA') #等价于 re.search('A ...
- Python中的网络编程之TCP
Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...
- Python中的网络编程之UDP
Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...
- Python之路 - 网络编程之Socket
Python之路 - 网络编程之Socket C/S架构 ? Socket ? 基于TCP ? 基于UDP ? Socket对象方法 ? C/S架构 ? 在网络通信中 , 一般是一方求一方应 , 求的 ...
- 网络编程之socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- 网络编程+go+java_GO语言的进阶之路-网络编程之socket
GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...
- GO语言的进阶之路-网络编程之socket
GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...
- java 网络编程简单聊天_网络编程之 TCP 实现简单聊天
网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...
最新文章
- matlab 迭代 混沌与分形实验报告,实验四 函数的迭代混沌与分形.doc
- document的createElement方法创建具有指定标签的DOM对象
- c打印无符号整数_C语言基础知识:printf的输出格式,C/C++语言编程讲解
- 前端学习(2767):下拉刷新的学习
- C++自学26:联合体(union/17)
- 实际参数列表和形式参数列表长度不同_Dynamo参数化轴网,这些对你很有帮助
- iOS设计模式 - 单例
- Pandas读取数据内存优化
- 实习踩坑之路:使用@Value注解导致Parse attempt failed for value [08:00],时间转换出错?
- MS SQL 2008数据库完全卸载指南
- nginx集群部署,实现负载均衡和nfs共享
- 第六章 姜小白当机立断逃莒国 姜诸儿瓜期不代终遇鬼
- html5ify插件,漂亮的jQuery对话框插件Dialogify
- 制作JavaCV应用依赖的基础Docker镜像(CentOS7+JDK8+OpenCV4)
- 2.基础语法:手指抽筋模拟器
- 【面试题】对闭包的理解?什么是闭包?
- 电赛知识补充——电机篇
- 快消行业订货系统解决方案
- shell脚本--if判断(数字条件、字符串条件)
- Kafka Eagle服务部署
热门文章
- 【Android自动化测试】Robot Framework+adb框架(五)——L1层测试用例
- 案例:图书管理(包括图书列表展示,添加、修改、删除图书功能)
- Cloudreve搭建公私兼备网盘、个网盘、文件分享-公有云系统
- Leetcode 688.Knight Probability in Chessboard
- gdb调试堆栈信息一堆问号如 #0 0x0000000000000000 in ?? () 看这里跟踪
- windows下openvc开发环境
- [编码] 曼彻斯特编码与解码
- prometheus联邦监控主机及k8s
- 计算机派位志愿填报技巧,2020小升初电脑随机派位填报志愿技巧
- 计算机控制在工业自动化中的作用,计算机在工业电器自动化控制的实现