网络协议
一、协议
1、>
传输层使用的两个主要协议:TCP和UDP。TCP面向连接,提供有序可靠的传输;Udp无连接,提供无序不可靠的传输。
TCP用三次握手和滑动窗口机制来保证传输的可靠性和进行流量控制。
第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以即X+1。
第三次握手
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方并且在数据段放写ISN的+1
使用socket进行网络编程的最简单方式是使用NSStream。NSStream类对流 *** 作进行了抽象,包括对各种流数据的读和写:内存流、网络流或文件流。当然,通过NSStream也可以与服务器进行通信。 无论是通过NSStream向服务器写数据,还是从NStream对象中读取服务器数据,都是一件简单的事情。在Mac OS X中,使用NSHost和NSStream与服务器进行连接的代码如下:
NSInputStream iStream;
NSOutputStream oStream;
uint portNo = 500;
NSURL website = [NSURLURLWithString:urlStr];
NSHost host = [NSHost hostWithName:[websitehost]]; [NSStream getStreamsToHost:host
port:portNo
inputStream:&iStream
outputStream:&oStream];
NSStream的getStreamsToHost:port:inputStream:outputStream:方法用于连接服务器并创建一对输入输出流用于向服务器读写数据。问题是iOS中并没有这个方法。因此上述代码无法用于iPhoneapp中。
要解决这个问题,需要为NSStream增加新的类别以增加getStreamToHost:Port:inputstream:outputStream:方法。在Xcode中新建文件NSStreamAdditionsm。然后在NSStreamAdditionsh中编写代码如下:
@interface NSStream (MyAdditions)
+ (void)getStreamsToHostNamed:(NSString)hostName
port:(NSInteger)port
inputStream:(NSInputStream )inputStreamPtr
outputStream:(NSOutputStream )outputStreamPtr;
@end
在NSStreamAdditionsm文件中加入下列代码。
#import "NSStreamAdditionsh"
@implementation NSStream (MyAdditions)
+ (void)getStreamsToHostNamed:(NSString)hostName
port:(NSInteger)port
inputStream:(NSInputStream )inputStreamPtr
outputStream:(NSOutputStream )outputStreamPtr
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN,ACK。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。第一次握手:建立连接时,客户端发送SYN包(SEQ=x)到服务器,并进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=x+1),同时自己也送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完毕,客户端和服务器时入Established状态,完成三次握手。方法/步骤1在配置工具中的服务和远程连接的外围应用配置器---》远程连接--》本地连接和远程连接--》同时使用TCP/IP和namedpipes。确定,重新启动sql服务。2然后用SQLServerManagementStudio,服务器类型选择数据库引擎3服务器名称输入你要连接的数据库实例名或IP地址,选择sqlserver身份验证,输入用户名、密码,就可以连接了一 FTP 说明 linux 系统下常用的FTP 是vsftp, 即Very Security File Transfer Protocol 还有一个是proftp(Profession ftp)。 我们这里也是简单的说明下vsftp的配置。 vsftp提供3种远程的登录方式: (1)匿名登录方式 就是不需要用户名,密码。就能登录到服务器电脑里面(2)本地用户方式 需要帐户名和密码才能登录。而且,这个帐户名和密码,都是在你linux系统里面,已经有的用户。 (3)虚拟用户方式 同样需要用户名和密码才能登录。但是和上面的区别就是,这个用户名和密码,在你linux系统中是没有的(没有该用户帐号)二 Vsftp的安装配置21 安装vsftp 的安装包,可以在安装里找到。 用yum 安装过程也很简单。 安装命令:yum install vsftpd22 相关命令221 启动与关闭[root@singledb ~]# service vsftpd startStarting vsftpd for vsftpd: [ OK ][root@singledb ~]# service vsftpd stopShutting down vsftpd: [ OK ][root@singledb ~]# service vsftpd restartShutting down vsftpd: [FAILED]Starting vsftpd for vsftpd: [ OK ][root@singledb ~]# /etc/initd/vsftpd startStarting vsftpd for vsftpd: [FAILED][root@singledb ~]# /etc/initd/vsftpd stopShutting down vsftpd: [ OK ][root@singledb ~]# /etc/initd/vsftpd restartShutting down vsftpd: [FAILED]Starting vsftpd for vsftpd: [ OK ][root@singledb ~]# /etc/initd/vsftpd statusvsftpd (pid 3931) is running[root@singledb ~]#222 其他命令--查看vsftpd 启动状态[root@singledb ~]# chkconfig --list vsftpdvsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off[root@singledb ~]# chkconfig vsftpd on[root@singledb ~]# chkconfig --list vsftpdvsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off 这里看到,默认情况下从2到5设置为on了。2到5是多用户级别。 这个对应的是linux不同的运行级别。我们也可以加level 选项来指定:[root@singledb ~]# chkconfig --level 0 vsftpd on [root@singledb ~]# chkconfig --list vsftpd vsftpd 0:on 1:off 2:on 3:on 4:on 5:on 6:off我们看到0已经设置为on了。我们可以使用man chkconfig 来查看帮助:--level levels Specifies the run levels an operation should pertain to It is given as a string of numbers from 0 to 7 For example, --level 35 specifies runlevels 3 and 5 传统的init 定义了7个运行级(run level),每一个级别都代表系统应该补充运行的某些特定服务: (1)0级是完全关闭系统的级别 (2)1级或者S级代表单用户模式 (3)2-5 级 是多用户级别 (4)6级 是 重新引导的级别(1)查看防火墙 我一般都是把系统的防火墙关闭了。 因为开了会有很多限制。[root@singledb ~]# /etc/initd/iptables statusTable: natChain PREROUTING (policy ACCEPT)num target prot opt source destination Chain POSTROUTING (policy ACCEPT)num target prot opt source destination 1 MASQUERADE all -- 1921681220/24 !1921681220/24 Chain OUTPUT (policy ACCEPT)num target prot opt source destination Table: filterChain INPUT (policy ACCEPT)num target prot opt source destination 1 ACCEPT udp -- 0000/0 0000/0 udp dpt:532 ACCEPT tcp -- 0000/0 0000/0 tcp dpt:533 ACCEPT udp -- 0000/0 0000/0 udp dpt:674 ACCEPT tcp -- 0000/0 0000/0 tcp dpt:67Chain FORWARD (policy ACCEPT)num target prot opt source destination 1 ACCEPT all -- 0000/0 1921681220/24 state RELATED,ESTABLISHED2 ACCEPT all -- 1921681220/24 0000/0 3 ACCEPT all -- 0000/0 0000/0 4 REJECT all -- 0000/0 0000/0 reject-with icmp-port-unreachable5 REJECT all -- 0000/0 0000/0 reject-with icmp-port-unreachableChain OUTPUT (policy ACCEPT)num target prot opt source destination You have new mail in /var/spool/mail/root--添加开放21号端口:[root@singledb ~]# /sbin/iptables -I INPUT -p tcp --dport 21 -j ACCEPT[root@singledb ~]# /etc/initd/iptables status Table: natChain PREROUTING (policy ACCEPT)num target prot opt source destination Chain POSTROUTING (policy ACCEPT)num target prot opt source destination 1 MASQUERADE all -- 1921681220/24 !1921681220/24 Chain OUTPUT (policy ACCEPT)num target prot opt source destination Table: filterChain INPUT (policy ACCEPT)num target prot opt source destination 1 ACCEPT tcp -- 0000/0 0000/0 tcp dpt:212 ACCEPT udp -- 0000/0 0000/0 udp dpt:533 ACCEPT tcp -- 0000/0 0000/0 tcp dpt:534 ACCEPT udp -- 0000/0 0000/0 udp dpt:675 ACCEPT tcp -- 0000/0 0000/0 tcp dpt:67Chain FORWARD (policy ACCEPT)num target prot opt source destination 1 ACCEPT all -- 0000/0 1921681220/24 state RELATED,ESTABLISHED2 ACCEPT all -- 1921681220/24 0000/0 3 ACCEPT all -- 0000/0 0000/0 4 REJECT all -- 0000/0 0000/0 reject-with icmp-port-unreachable5 REJECT all -- 0000/0 0000/0 reject-with icmp-port-unreachableChain OUTPUT (policy ACCEPT)num target prot opt source destination --保存配置[root@singledb ~]# /etc/rcd/initd/iptables saveSaving firewall rules to /etc/sysconfig/iptables: [ OK ]--重启防火墙:[root@singledb ~]# service iptables {startstoprestart}(2)查看关闭selinux[root@singledb ~]# sestatusSELinux status: disabled我这里在安装 *** 作系统的时候就关闭了selinux,如果没有关闭,可以修改如下文件来关闭:[root@singledb ~]# cat /etc/sysconfig/selinux# This file controls the state of SELinux on the system# SELINUX= can take one of these three values:# enforcing - SELinux security policy is enforced# permissive - SELinux prints warnings instead of enforcing# disabled - SELinux is fully disabledSELINUX=disabled# SELINUXTYPE= type of policy in use Possible values are:# targeted - Only targeted network daemons are protected# strict - Full SELinux protectionSELINUXTYPE=targeted[root@singledb ~]#保存退出并重启系统reboot三 FTP配置文件FTP 安装好之后,在/etc/vsftpd/目录下会有如下文件:[root@singledb ~]# cd /etc/vsftpd/[root@singledb vsftpd]# lsftpusers user_list vsftpdconf vsftpd_conf_migratesh[root@singledb vsftpd]#vsftpdconf: 主配置文件ftpusers: 指定哪些用户不能访问FTP服务器user_list: 指定的用户是否可以访问ftp服务器由vsftpdconf文件中的userlist_deny的取值来决定。[root@singledb vsftpd]# cat user_list# vsftpd userlist# If userlist_deny=NO, only allow users in this file# If userlist_deny=YES (default), never allow users in this file, and# do not even prompt for a password# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers# for users that are denied我们过滤掉#的注释后,查看一下vsftpdconf 文件:[root@singledb ftp]# cat /etc/vsftpd/vsftpdconf grep -v '^#';anonymous_enable=YESlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESlisten=YESpam_service_name=vsftpduserlist_enable=yestcp_wrappers=YES至于这些参数的意思,在注释里有详细的说明。我们可以在vsftpdconf 文件设置如下参数:(1)ftpd_banner=welcome to ftp service :设置连接服务器后的欢迎信息(2)idle_session_timeout=60 :限制远程的客户机连接后,所建立的控制连接,在多长时间没有做任何的 *** 作就会中断(秒)(3)data_connection_timeout=120 :设置客户机在进行数据传输时,设置空闲的数据中断时间(4)accept_timeout=60 设置在多长时间后自动建立连接(5)connect_timeout=60 设置数据连接的最大激活时间,多长时间断开,为别人所使用;(6)max_clients=200 指明服务器总的客户并发连接数为200(7)max_per_ip=3 指明每个客户机的最大连接数为3(8)local_max_rate=50000(50kbytes/sec) 本地用户最大传输速率限制(9)anon_max_rate=30000匿名用户的最大传输速率限制(10)pasv_min_port=端口(11)pasv-max-prot=端口号 定义最大与最小端口,为0表示任意端口;为客户端连接指明端口;(12)listen_address=IP地址 设置ftp服务来监听的地址,客户端可以用哪个地址来连接;(13)listen_port=端口号 设置FTP工作的端口号,默认的为21(14)chroot_local_user=YES 设置所有的本地用户可以chroot(15)chroot_local_user=NO 设置指定用户能够chroot(16)chroot_list_enable=YES(17)chroot_list_file=/etc/vsftpd/chroot_list(只有/etc/vsftpd/chroot_list中的指定的用户才能执行 )(18)local_root=path 无论哪个用户都能登录的用户,定义登录帐号的主目录, 若没有指定,则每一个用户则进入到个人用户主目录;(19)chroot_local_user=yes/no 是否锁定本地系统帐号用户主目录(所有);锁定后,用户只能访问用户的主目录/home/user,不能利用cd命令向上转;只能向下;(20)chroot_list_enable=yes/no 锁定指定文件中用户的主目录(部分),文件:/chroot_list_file=path 中指定;(21)userlist_enable=YES/NO 是否加载用户列表文件;(22)userlist_deny=YES 表示上面所加载的用户是否允许拒绝登录;(23)userlist_file=/etc/vsftpd/user_list 列表文件限制IP 访问FTP:#vi /etc/hostsallowvsftpd:1921685128:DENY 设置该IP地址不可以访问ftp服务FTP 访问时间限制:#cp /usr/share/doc/vsftpd-113/vsftpdxinetd /etc/xinetdd/vsftpd#vi /etc/xinetdd/vsftpd/修改 disable = noaccess_time = hour:min-hour:min (添加配置访问的时间限制(注:与vsftpdconf中listen=NO相对应)例: access_time = 8:30-11:30 17:30-21:30 表示只有这两个时间段可以访问ftpftp的配置基本上只有这些了。 默认情况下,ftp根目录是/var/ftp。 如果要修改这个目录位置,可以更改/etc/passwd 文件:[root@singledb ftp]# cat /etc/passwd grep ftpftp:x:14:50:FTP User:/var/ftp:/sbin/nologin创建一个用户来访问FTP,并指定该用户的FTP 目录:[root@singledb u02]# useradd -d /u02/qsftp qs[root@singledb u02]# passwd qsChanging password for user qsNew UNIX password:BAD PASSWORD: it is WAY too shortRetype new UNIX password:passwd: all authentication tokens updated successfully这里指定的是/u02/qsftp 这个目录,要注意个目录的权限。更改用户不能telnet,只能ftp: usermod -s /sbin/nologin username //用户只能ftp,不能telnet usermod -s /sbin/bash username //用户恢复正常禁止用户ssh登陆 useradd username -s /bin/false 更改用户主目录: usermod -d /bbb username //把用户的主目录定为/bbb然后用qs这个用户就可以访问了。 以上只是一些简单的设置。 在用户权限这块还有很多内容可以研究。 比如特定用户的特定权限。 安全性等。 以后在研究了。
同学您好,这个问题我分开解答哈!①单个用户与单个服务器通信采用Socket进行连接,用户方面的流程是:1新建套接字Socket s;2确定服务器IP地址和端口号 addr = 192168112 port = 8080;3对本机地址进行显式或隐式绑定(一般采用隐式绑定故这步可以忽略)4开启与服务器的连接connect(s,addr);5进行数据交互传输 send recv;6通信结束 关闭套接字closesocket(s);
服务器方面的流程是:1新建套接字Socket s;2确定本地IP和端口号(不能隐式绑定)addr = 192168112 port = 8080;3对本地IP和端口进行绑定bind(s,addr);4对端口进行监听listen(s);5接收一个连接 newsock = accept(s);6进行数据交互传输 send recv;7通信结束 关闭套接字closesocket(s)。
②单个服务器与多个用户的通信连接,用户端与①中流程相同,服务器端第5步接收了一个连接之后开始不同。服务器在接收了一个连接之后,便新建一个套接字newsock,此时要开启一个子线程来负责处理与该用户机的数据传输,而主线程继续监听端口创建新的子线程来与多个用户进行连接。C下可以采用createThread函数,
CreateThread( NULL,0,chat, //子线程函数入口
&newsock, //传给子线程的参数
0, &Tid);然后在chat函数中进行recv和send即可
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)