TCP连接:SYN ACK RST UTG PSH FIN

TCP的三次握手是怎么进行的:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手;接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它连接已被确认,这就是第三次握手。之后,一个TCP连接建立,开始通讯。
*SYN:同步标志
同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把 TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。

 

*ACK:确认标志
确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。

*RST:复位标志
复位标志有效。用于复位相应的TCP连接。

*URG:紧急标志
紧急(The urgent pointer) 标志有效。紧急标志置位,

*PSH:推标志
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。

*FIN:结束标志
带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于状态,准备接收后续数据。

.TCP的几个状态对于我们分析所起的作用。在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。

NFS使用记录

第一步:#serviceconf
第二步:启动portmap和nfs(每次修改exports都要重启nfs才会生效)
第三步:#vi /etc/exports
第四步:/root 202.199.159.193(rw)
option:
ro 只读
rw 读写
noaccess 无权
第五步:在202.199.159.193这个IP的机器上,#mount 10.10.138.192:/root cc0cc/(如果不行可以试试把10.10.138.192的iptables关掉)
提示:由于它的认证机制是基于IP地址的,因而容易被ip-spoofing攻击.一般除非必要不要打开这项服务.

intel汇编与AT&T的区别

[文章作者:陈臻 本文版本:v1.0 最后修改:2006.10.26 转载请注明原文链接:http://www.54chen.com/c/30]

在设计mynet的时候用到这个,其实二者区别不是太多,总结一下有下面几点:
1.intel的mov 变成了movb movl mov (后面对应8 16 32位的作位)
) 2.寄存器都加百分号
3.作都是反过来的:mov al,cl(inter)==movb %cl,%al

而在gcc里的内联汇编也有不同,用起来也是挺好用的,看例~
main(){
char tmp;
__asm__(
"movb %1, %%cl;"
"movb %%cl, %%dl;"
"shl $7,%%edx;"
"movb %%cl,%%al;"
"and $2,%%eax;"
"shr $1,%%al;"
"or %%eax,%%edx;"
"movb %%cl,%%al;"
"and $4,%%eax;"
"shl $2,%%eax;"
"or %%eax,%%edx;"
"movb %%cl,%%al;"
"and $8,%%eax;"
"shl $2,%%eax;"
"or %%eax,%%edx;"
"movb %%cl,%%al;"
"and $0x10,%%eax;"
"shl $2,%%eax;"
"or %%eax, %%edx;"
"movb %%cl,%%al;"
"and $0x20,%%eax;"
"shr $2,%%al;"
"or %%eax,%%edx;"
"movb %%cl,%%al;"
"and $0x40,%%eax;"
"shr $4,%%al;"
"or %%eax,%%edx;"
"and $0x80,%%ecx;"
"shr $6,%%cl;"
"or %%ecx,%%edx;"
"movb %%dl, %0;"
:"=r"(tmp) //tmp变量写出,就是上文中的%0,第0个参数
:"r"(tmp) //tmp写入,就是上文中的%1,第1个参数
:"%ecx","%edx");

//tmp变了;
} 这来自一段用过的加密过程中,8位的tmp变量传入了内嵌的汇编中,一通翻江倒海后变了。。。

Linux C获取机器MAC及IP的两个函数

[文章作者:陈臻 本文版本:v1.0 最后修改:2006.10.25 转载请注明原文链接:http://www.54chen.com/c/28]

以下两函数分别将mac ip通过memcpy至mac_addr和ip_addr
char *
get_mac()
int nSocket;
struct ifreq struReq;
nSocket = socket(PF_INET,SOCK_STREAM,0);
memset(&struReq,0,sizeof(struReq));
strncpy(struReq.ifr_name, "eth0", sizeof(struReq.ifr_name));
ioctl(nSocket,SIOCGIFHWADDR,&struReq);
close(nSocket);
memcpy(mac_addr,(char *)ether_ntoa(struReq.ifr_hwaddr.sa_data),strlen((char
*)ether_ntoa(struReq.ifr_hwaddr.sa_data)));
return 0;
char *
get_ip()
{ int sock;
struct sockaddr_in sin;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
{ perror("socket");
return "";
} strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
{ perror("ioctl");
return "";
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
close(sock);
memcpy(ip_addr,inet_ntoa(sin.sin_addr),strlen(inet_ntoa(sin.sin_addr)));
return "";
}

APACHE常用设置

KeepAliveTimeout 5

是允许用户保持连接5秒内有效,如果用户在5秒内点击其他页面不需要重新建立联结,这个值设置短不利于降低效率,如果设置长可能导致的同时联结数会跟高,一般建议按照缺省的15

MaxKeepAliveRequests 这个缺省是100 你这个设置太高了,这个使用户连续访问了多少个页面后重新建立联结,你这个值3000,好像太高了点

MinSpareServers 5
MaxSpareServers 10
StartServers 5
如果服务器经常有突发大量请求的话,建议值都稍微太高点
MaxClients 150
这个是服务器最大联结数,如果超过150联结的话系统就有等待情况,如果繁忙的话150是不够的,你可以用命令 ps -ef|grep httpd|wc -l 看看有多少联结,一直接近150的话,建议增大一些

MaxRequestsPerChild 0
这个建立设置10000,apache避免程序有异常,定义一个子进程完成多少个请求以后退出,如果是0就是永远不退出。如果对自己程序比较难把我的话建议设置一个稍大的值而不是0

Linux下系统托盘的实现

[文章作者:陈臻 本文版本:v1.0 最后修改:2006.10.13 转载请注明原文链接:http://www.54chen.com/c/24]
在gnome的网页上找到这个内容,他们把它叫做“通知功能图标”。它是一个在未来版本中决定发布的已实现包。
http://www.gnome-cn.org/documents/tutorial/system-tray-icon-application/implement-your-tray
具体实现前需要在下载两个开发补丁源文件,然后包含头文件到你的文件中。
具体代码:
void
create_tray (tray_demo * tray)
{ GtkWidget *image;
GtkWidget *event_box;
GtkTooltips *tooltips;
EggTrayIcon *tray_icon;
tooltips = gtk_tooltips_new ();
tray_icon = egg_tray_icon_new ("Tray icon demo");
event_box = gtk_event_box_new ();
gtk_container_add (GTK_CONTAINER (tray_icon), event_box);
g_signal_connect (G_OBJECT (event_box), "button-press-event",
G_CALLBACK (tray_button_press_event_cb), tray);
gtk_tooltips_set_tip (GTK_TOOLTIPS(tooltips), event_box, _("Try a left/right click"), NULL);
image = load_image (GCN_ICON);
gtk_container_add (GTK_CONTAINER (event_box), image);
gtk_widget_show_all (GTK_WIDGET (tray_icon));
return;
}

MySQL中各种字段的取值范围

TINYINT
-128 - 127

 

TINYINT UNSIGNED
0 - 255

SMALLINT
-32768 - 32767

SMALLINT UNSIGNED
0 - 65535

MEDIUMINT
-8388608 - 8388607

MEDIUMINT UNSIGNED
0 - 16777215

INT 或 INTEGER
-2147483648 - 2147483647

INT UNSIGNED 或 INTEGER UNSIGNED
0 - 4294967295

BIGINT
-9223372036854775808 - 9223372036854775807

BIGINT UNSIGNED
0 - 18446744073709551615

FLOAT
-3.402823466E+38 - -1.175494351E-38
0 1.175494351E-38 - 3.402823466E+38

DOUBLE 或 DOUBLE PRECISION 或 REAL
-1.7976931348623157E+308 - -2.2250738585072014E-308
0 2.2250738585072014E-308 - 1.7976931348623157E+308

DECIMAL[(M,[D])] 或 NUMERIC(M,D)
由M(整个数字的长度,包括小数点,小数点左边的位数,小数点右边的位数,但不包括负号)和D(小数点右边的位数)来决定,M缺省为10,D缺省为0

DATE
1000-01-01 - 9999-12-31

DATETIME
1000-01-01 00:00:00 - 9999-12-31 23:59:59

TIMESTAMP
1970-01-01 00:00:00 - 2037年的某天(具体是哪天我也不知道,呵呵)

TIME
-838:59:59' to 838:59:59

YEAR[(2|4)]
缺省为4位格式,4位格式取值范围为1901 - 2155,0000,2位格式取值范围为70-69(1970-2069)

CHAR(M) [BINARY] 或 NCHAR(M) [BINARY]
M的范围为1 - 255,如果没有BINARY项,则不分大小写,NCHAR表示使用缺省的字符集.在数据库中以空格补足,但在取出来时末尾的空格将自动去掉.

[NATIONAL] VARCHAR(M) [BINARY]
M的范围为1 - 255.在数据库中末尾的空格将自动去掉.

TINYBLOB 或 TINYTEXT
255(2^8-1)个字符

BLOB 或 TEXT
65535(2^16-1)个字符

MEDIUMBLOB 或 MEDIUMTEXT
16777215 (2^24-1)个字符

LONGBLOB 或 LONGTEXT
4294967295 (2^32-1)个字符

ENUM('value1','value2',...)
可以总共有65535个不同的值

SET('value1','value2',...)
最多有64个成员

MySql作要点整理

列类型 需要的存储量
TINYINT 1 字节
SMALLINT 2 个字节
MEDIUMINT 3 个字节
INT 4 个字节
INTEGER 4 个字节
BIGINT 8 个字节
FLOAT(X) 4 如果 X < = 24 或 8 如果 25 < = X < = 53
FLOAT 4 个字节
DOUBLE 8 个字节
DOUBLE PRECISION 8 个字节
REAL 8 个字节
DECIMAL(M,D) M字节(D+2 , 如果M < D)
NUMERIC(M,D) M字节(D+2 , 如果M < D)

 

日期和时间类型
列类型 需要的存储量
DATE 3 个字节
DATETIME 8 个字节
TIMESTAMP 4 个字节
TIME 3 个字节
YEAR 1 字节

串类型
列类型 需要的存储量
CHAR(M) M字节,1 <= M <= 255
VARCHAR(M) L+1 字节, 在此L <= M和1 <= M <= 255
TINYBLOB, TINYTEXT L+1 字节, 在此L< 2 ^ 8
BLOB, TEXT L+2 字节, 在此L< 2 ^ 16
MEDIUMBLOB, MEDIUMTEXT L+3 字节, 在此L< 2 ^ 24
LONGBLOB, LONGTEXT L+4 字节, 在此L< 2 ^ 32
ENUM('value1','value2',...) 1 或 2 个字节, 取决于枚举值的数目(最大值65535)
SET('value1','value2',...) 1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)

mysql不区分大小写!
1.#service mysqld start 启动mysql
2.(打mysql进入后)show databases; 显示所有库
3.use(或connect) 库名 使用此数据库
4.show tables; 显示所有表
5.GRANT ALL ON 库名.* TO 用户名; root可执行,给不同的数据库不同的用户管理
6.CREATE DATABASE 新库名; 新建一个数据库
7.quit 退出mysql,另外的参见sql/9
mysqladmin -uroot password "youpassword" 修改管理员密码
GRANT ALL   ON 库名.*   TO user IDENTIFIEDBY "password"   WITH GRANT OPTION;
WITH GRANT OPTION 子句是可选的。如果包含该子句,该用户可以将GRANT 语句授予的任何权限授予其他的用户。可以使用该子句将授权的能力授予其他的用户。
GRANT ALL   ON 库名.*   TO user IDENTIFIEDBY "password"   WITH GRANT OPTION;
WITH GRANT OPTION 子句是可选的。如果包含该子句,该用户可以将GRANT 语句授予的任何权限授予其他的用户。可以使用该子句将授权的能力授予其他的用户。

撤权并删除用户
要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了TO用FROM取代并且没有INDETIFED BY和WITH GRANT OPTION子句:
============================================
REVOKE privileges (columns) ON what FROM user
============================================
user部分必须匹配原来GRANT语句的你想撤权的用户的user部分。privileges部分不需匹配,你可以用GRANT语句授权,然后用REVOKE语句只撤销部分权限。
============================================
REVOKE语句只删除权限,而不删除用户。即使你撤销了所有权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。要完全删除一个用户,你必须用一条DELETE语句明确从user表中删除用户记录:
============================================
%mysql -u root mysqlmysql>DELETE FROM user ->WHERE User="user_name" and Host="host_name";mysql>FLUSH PRIVILEGES; 
============================================
DELETE语句删除用户记录,而FLUSH语句告诉服务器重载授权表。(当你使用GRANT和REVOKE语句时,表自动重载,而你直接修改授权表时不是.
============================================