관리 메뉴

Value Creator의 IT(프로그래밍 / 전자제품)

#4 리눅스 네트워크 프로그래밍 본문

1. 프로그래밍/4) Network

#4 리눅스 네트워크 프로그래밍

valuecreatort 2019. 6. 18. 18:30
반응형

1. 윈도우와 리눅스의 소켓 방식

리눅스의 소켓 = 파일의 일종

파일 입출력 함수를 네트워크 상에서 데이터 송수신할 때 사용 가능

윈도우는 파일과 소켓을 구분하므로 별도의 데이터 송수신 함수 참조

 

리눅스의 파일 디스크립터(또는 파일 핸들) --> 파일 또는 소켓에 부여된 정수값

0 : Standard Input

1 : Standard Output

2 : Standard Error

 

윈도우 소켓 : 소켓 핸들 반환

리눅스 소켓(파일) : 파일 핸들 반환

윈도우는 파일 핸들과 소캣 핸들 구분해서 사용

 

윈도우 입출력 함수 : send, recv

리눅스 입출력 함수 : read, write

 

WSA : Win Socket API

API : Application Interface

 

소켓의 종류

1) 연결지향형 소켓

2) 비연결지향형 소켓

 

인터넷 프로토콜의 종류

1) TCP(Transmission Control Protocol) : 연결 지향, 스트림 기반 소켓

2) UDP

 

스택(Stack) : 계층

 

4단계 계층

LINK 계층 --> IP 계층 --> TCP 계층 --> Application 계층

--> 대부분의 네트워크 프로그래밍은 Application 계층 설계 및 구현이다.

 

NIC(Network Interface Controller) : 물리적인 네트워크 장치

 

2. Big endian과 Little endian

0x12345678이라는 데이터를 저장할 때

1) 빅 엔디안

주소 0x20번 0x21번 0x22번 0x23번
0x12 0x34 0x56 0x78

 

2)리틀 엔디안(빅 엔디안과 다르게 맨 뒤부터 저장)

주소 0x20번 0x21번 0x22번 0x23번
0x78 0x56 0x34 0x12

 

인텔, AMD 계열 CPU : 리틀 엔디안 방식

 

네트워크 바이트 전송 방식 : 빅 엔디안으로 규정됨

 

CPU 방식이 빅 엔디안이냐, 리틀 엔디안이냐에 관계없이 빅 엔디안으로 변환해주는 함수가 필요

 

 

3. 소켓 연결 절차

1) 함수 호출 순서

* TCP 서버

소켓 생성 --> 생성된 소켓의 주소 할당 --> 연결요청 대기 --> 연결 허용 --> 데이터 송, 수신  --> 연결 종료

socket()   --> bind()                         --> listen()           --> accept()    --> read(), write()    --> close()

 

* TCP 클라이언트

소켓 생성 --> 연결 요청 --> 데이터 송, 수신 --> 연결 종료

socket()    --> connect() --> read(), write()    --> close()

 

2) Iterative 서버

socket()   --> bind()  --> listen() --> accept()    --> read(), write()    --> close(client) --> close(server)

                                           ↑                                                      ↓

                                           ←←←←←←←←←←←←←←←←←←←←←←

반복문을 삽입해서 accept() 함수를 반복 호출하면 구현 가능

 

3) 에코(Echo) 서버/클라이언트

서버는 클라이언트로부터 받은 메세지를 그대로 재전송한다.

데이터의 크기가 작다면 문제가 없는 것 처럼 보이지만, 데이터의 크기가 커지면 오류가 발생할 수 있다.

 

4. TCP의 역할

데이터를 주고 받는 과정에서 서로 데이터를 잘 주고 받았는지 확인하고, 분실된 데이터는 재전송해준다.

IP는 데이터 전송의 신뢰성을 보장하지 않는다.

ex) 첫 번째 패킷을 보낸다. 잘 받았는지 확인한다.

잘 받았다는 확인을 받으면 두 번째 패킷을 보낸다. 잘 받았는지 확인한다.

응답이 없다. 두 번째 패킷을 재전송한다.

 ... ... ... 이런 방식으로 데이터를 전송한다.

 

 

5. TCP 입출력 버퍼

TCP를 통해 데이터를 주고 받을 때, 데이터가 오고 가는 완충 지대가 필요하다.

데이터를 임시로 저장해 놓는 곳을 버퍼라고 한다.

A <-> B 통신할 때,

A에서 출력된 값은 곧바로 B의 디스크에 저장되는 것이 아니라, B의 입력 버퍼를 거친 다음에 저장된다.

B에서 출력된 값도 마찬가지로 A의 버퍼를 거친 다음에 A의 디스크에 저장된다.

한 방에 모든 데이터를 전송할 수 없기 때문에 버퍼를 거친다.

A의 출력 버퍼 --> B의 입력 버퍼

A의 입력 버퍼 <-- B의 출력 버퍼

버퍼가 데이터를 얼만큼 받을 수 있는지 TCP를 통해 지속적으로 확인하기 때문에, 데이터가 중간에 소멸되는 일은 없다.

 

 

버퍼사이즈 결정

서버 주소

클라이언트 주소

파일 크기 읽기

fopen으로 파일 열기

write로 클라이언트에 파일 쓰기(파일 크기 만큼)

클라이언트에서 온 메세지 read로 읽기

fclose로 파일 닫기

클라이언트 닫기

서버 닫기

 

 

 

 

 

반응형
Comments