《计算器网络笔记》

1.TCP套接字

  服务器先运行,等待连接建立

1.创建一个socket,一个整性数值。(假如该sock叫welcome_sock为8888)

2.bind,和本地端口捆绑。(注意,当前的socket绑定了服务器端的ip和端口当前的welcome_sock会变成8888:本地IP:本地端口)

3.用accept等待远程连接,如果没有则阻塞。如果客户端连接成功后,则会返回一个新的connect_socket。该socket除了绑定了服务器端的ip和端口,还绑定了客户端的ip和端口。因此socket是一个四元组)(当client端调用connect发送连接请求后,accept会先应答一个ACK和SYN报文这样的一个报文回去。再等待client端的一个ACK报文后,则连接建立成功,返回一个新的sock:8899:本地ip:本地端口:目标ip:目标端口)(这个时候,我们可以利用welcome_sock继续去等待客户端的一个连接,而connect_socket就可以利用fork去做自己的事情)

 4.接受数据

  客户端

1.创建客户端本地套接字(隐式绑定本地port,客户端会默认分配一个空闲的port)(假如sock为2222:本地IP:本地端口)

2.connect指定去连接服务器连接。(connect一旦被调用,就会开始三次握手的第一个连接报文请求,等到TCP server的ACK和SYN的这样一个报文后才接除阻塞)(一旦我们调用connect后,sock就变成2222:本地ip:本地端口:目的ip:目的端口)

3.发送数据

 

其中sockaddr_in的结构体中port和addr就是为了存放本地的ip地址和端口号。

注意:

1.sock中不仅有本地ip和端口、目的ip和端口还有一些状态和pid(pid为了指示该sock属于哪个进程,这样收数据的时候就知道给到哪个进程去处理了)

问题:

1.为什么server端需要显示绑定ip和port,但是客户端是隐式的?

  因为server端我们不指定端口,我们写的client端就不知道去连接哪个端口。假如server也隐式的的bind一个未使用的端口,那么就还需要增加一个获取当前sock绑定的本地port的操作。client端隐式的bind,系统默认分配一个未使用的port。是因为client一旦接连上server后,server的socket就获取到client端的ip和端口了。

 

2.同一个机器中的同一个port可以被复用嘛?

  可以被复用。就比如tcp server开始socket的时候会创建一个welcome_sock,等到accept成功后会返回一个connect_sock,这两个sock就是使用同一个本地port(假如port是8000),但是他们的sock的值不一样,welcome_sock是8888,但是connect_sock是8899,这其实就是2个不同的会话了。

 

2.UDP

  UDP没有连接,因此在发送端在每一个报文中需要明确的指定目标ip和端口。服务器必须从收到的分组中提取出发送端的ip和端口。

服务器:

1.socket,创建一个sock

2.bind,绑定本地ip和端口

3.readfrom,接收数据,并在参数中返回是哪个ip和端口发送过来的数据。(没有数据则一直处于阻塞状态)

 

客户端:

1.socket,创建一个sock

2.bind,绑定本地ip和端口

3.sendto,发送数据,指明发送的服务器ip和端口。

 

 

 

注意:

1.TCP和UDP的端口不互用。假如TCP占用了8000端口,UDP依然可以使用8000端口。

 

问题:

  1.为什么UDP可以广播、组播,而TCP不行?

posted @ 2022-11-17 20:43  一个不知道干嘛的小萌新  阅读(56)  评论(0)    收藏  举报