System_programming_study_210630

Day3

서버와 통신하는 프로그램을 만들기 위해서 소켓, TCP/IP 등의 개념을 공부했다. 예제를 보면서 공부하고, 어려웠던 부분들을 함께 나누고 질문하면서, 네트워크와 관련해서 얕게 가지고있던 개념들이 좀더 체계적으로 정리가 되는 느낌이었다.

  1. Socket을 사용한 프로그램 예제를 보면서 기본적인 구조에 대해서 알아보았다. 먼저 소켓을 만드는 함수 socket()를 통해서 소켓 구조를 만들고, bind 함수를 통해서 실제 IP와 포트, 프로토콜 등을 설정하면서 서버를 활성화(?)한다. 이것을 바인드 한다고 표현한다. 그후의 구조는 서버에서 listen함수를 통해서 클라이언트의 연결을 대기하는 상태가 되고, 클라이언트가 connect 요청을 보내면 서버에서 accept해서 소켓에 할당해준다.
  1. listen함수를 통해서 서버를 대기상태로 만들때, 최대 접속 가능한 클라이언트의 수를 인자로 넣게된다. 즉 waiting queue의 크기를 지정할 수 있는데, 클라이언트가 connect요청을 하면, 큐에 요청이 쌓이게 되고, 서버에서 그 요청들을 accept하는 것이라고 이해했다. 이때 그 여러개의 요청들을 동시적으로 처리하기 위해서, 보통 accept를 통해서 연결된 소켓을 자식 프로세스나 쓰레드에 할당하는 구조로 이루어 지는것이라고 이해했다.
  1. 포트번호는 하나의 IP내에서 여러개의 프로그램(서버)를 지원해주는 개념으로 이해했다. 바인드 할때, 각각의 서버마다 다른 포트를 지정해서, 여러개의 프로그램이 하나의 아이피컴퓨터 에서 열릴 수 있는 것이다. 내 경험상 ssh 서버에 접속할때는 항상 22번 포트를 사용했던 것 같다, 그래서 아마 포트 번호마다 사용하는 프로그램의 종류?가 지정되어있거나 규칙처럼 그렇게 사용하는것 같다.
  1. 소켓을 통해서 서버와 클라이언트가 연결되고 나면, 데이터를 주고받는 과정은 파일에서 하는것과 똑같았다. recv()함수가 read()기능을하고, send()함수는 write()기능을 한다. 중요한 점은, 네트워크를 통해서 데이터를 주고받을때는 높은 확률로 데이터가 다 전송되지 않는 등의 문제가 발생한다. 왜 그런지 자세히는 모르겠지만 외부와 통신하는 과정이기 때문에 불안정할 수 있겠다 정도로 이해했다. 그렇기 때문에 서버를 통해서 통신할 때는 더더욱 신경써서 결과를 확인하고 누락된 데이터를 전송하는 과정이 필요하다.