네트워크의 애플리케이션 레이어에 대한 이야기입니다. 아직까지는 os 안에 존재하는 라우터들 이런거 까지는 몰라도 되는 수준이에요. 사용자 계층에서 동작하는 애플리케이션에 대한 내용이기 때문에. 스마트폰에서 동작하는 앱들 다 네트웤 사용하죠. 네트웤이라는 이름이 붙었을 뿐이지 프로그램을 동작하는 프로세스일 뿐인데 단지 다른 컴퓨터에서 존재하는 프로세스와 메세지를 교환한다는 특징이 있을 뿐. 프로그램인데 통신이라는 기능이 들어간 것 뿐인데, 실제로 보게되면, 스마트폰에서 동작하는 프로그램이 웹서버와 메세지를 교환하고 이렇게 하는데, 그 안에 넽 트웤 어케 생겼는지 모르고 관심도 없죠? 몰라도 네트웤 프로그램을 작성할 수 있어요. 서로다른 머신에 있는 프로세스와 메세지를 교환하는 프로그램을 구현하는게 첫 번째 프로젝트인데, 별거 아니에요 내려가는 인터페이스 요거만 사용할 줄 알면 되는거야.

우리가 흔히 아는 네트웤 인터넷의 사용 패턴으로 서버와 클라이언트 모델이 있어요. 서버는 24시간 켜져있고, 고정된 주소를 가지고 있겠죠. 그래야 찾아올 수 있으니가, 클라이언트는 간헐적으로 서버에 뭔가를 요청하고… 주소라는 개념은 정확히 몰라도돼요. 주소라고 하나보다 그렇게 이해해. 클라이언트는 먼저 교신을 시작하니까 고정된 장소에 없어도 되어요.

실제로는 프로세스와 프로세스 사이의 통신이고, 클 프로세스와 서버 프로세스ㅇ 사이에서 클이 먼저 말을 거는 구조가 되겠다고요. 인터커뮤니케이션 프로세싱 같은걸 이번학기에 배울텐데, 프로세스들이 많이 있잖아요. 그 프로세스들 사이에 메세지 교환이 필요한 경우가 있거든요? 그럴 때 프로세스간의 통신이라고 해서 IPC라는 게 있어요. 이넡 프로세스 커뮤니케이션인데, 그냥 다른 머신에 있다는 것이라는 차이밖에 없는 거야~ 다른 머신의 프로세스와의 IPC를 위해서 준비해놓은 구멍 (= 우체통 = 소켓)

그래서 여러분이 보내고자하는 메세지를 요 소켓에 넣으면 얘가 알아서 원하는 상대방 프로세스로 전달을 하게해요. 받는 곳에도 소켓이 있어서 딱 꺼내서 읽으면 되는거야. 요 프로세스를 위해서는 편지봉투에 주소를 적어야 되니까 주소가 필요해. 인터넷 상에서 존재하는 특정 머신을 지칭하는 주소다. 요 서버 프로세스로 메세지를 보내기 위해서는 IP address만으로는 부족해요. 이 머신 안에 많은 프로세스들이 있잖아요. 요 많은 프로세스 중에 요 프로세스만을 원하기 때문에 또 다른 주소가 필요해요. 그게 바로 포트 번호라는 거예요~. 그래서 ip 주소 === 컴퓨터, port === 프로세스 주소

결국 네트워크 애플리케이션을 작성한다는 얘기는 소켓 프로그래밍을 한다는 이야기에요.

서버 프로세스로 메세지를 보내기 위해서는 뭘 알아야 되냐면 서버 머신의 ip주소와 process 의 port number를 알아야 해.

보통은 각 프로토콜마다 고유의 포트 넘버가 정해져있어. 예를들어, 웹(http)서버는 웬만하면 80번으로 세팅이 되어있어.

브라우저에 주소 치면 어떤 일이 벌어지냐면, dns에서 도메인을 ip주소로 바뀌어, port 넘버 알아내려고 노력할 필요없이 웹서버 프로세스의 포트넘버는 웬만하면 암묵적으로 동의했어 80쓰기로, 그래서 자동으로 80포트로 가는거야. 매번 찾을 필요없이 정해놓으니까 편하죠.

하지만 만약에 여러분만의 프로젝트를 하다가 포트넘버가 필요해. 90에 동작하기로 했어 브라우저 창에 그럼 그냥 주소만 치면 안되겠죠. www.dadsf.asdfa:90 이렇게 명시를 해줘야돼 안그러면 자동으로 80으로 보내니까 클라이언트 프로세스는 자기 맘대로 포트넘버를 가져도돼. 0~2의 16승

TCP / UDP

어쨌든 지금 우리가 사용자 입장에서 이야기하고 있기 때문에 네트웤사용자로서 이 이전에 우리에게 서비스해줫으면 좋겟다느 ㄴ기대가 잇을거아냐 예를들면 타이밍, 0.1초안에 절로 도달했음 좋겠다든지, 이런 타이밍에 대한 요구사항, 혹은 보안에 대한거 받는 사람 이외에 아무도 못봤으면 좋겠다든지 서비스에 대한 기대, 아니면 데이터를 보냈는 데, throughput이 나왔으면 좋겠다든지, 이런 기대가 있는데 인터넷은 어떠한 서비스도 제공해주지 않아요. 오직 유실없이 전달해준다는 data integrity만 제공해주기 때문에 사용자가 굳이 원한다 이러면 사용자계층에서 프로그램으로 만들어서 써야돼. tcp라느 ㄴ서비스를 통해서 신뢰성있는 통신만 보내줄 뿐 어ㄷ떠한것도 제공해주지 않아요.

얼마만큼 빠른 속도로 보낼지는 얘가 관리를 하는거죠. 플로우 컨트롤이라는 거는 리시버의 능력에 맞게 보내주는 거. 비유를 들자면, 교수님이 말의 속도랑 관계없이 데이터를 보내고 있는데, 컴공전공의 대학생이니까 이정도 속도로 정보전달하는 거죠. 초등학생이다 이카면 정보 전달되겠어요? 안되겠죠. 그래서 수신자의 능력에 맞춰 보낸다는 거예요.

congestion control: 이건 네트워크 상황에 맞게 보낸다는 거예요. 네트웤이 꽉 막혀있다 그럼 천천히, 뚫려있다 그럼 좀 빠르게,

둘다 보내는 속도를 조절하는건데 결국에 그 둘중에 더 안좋은 것에 맞춰서 속도를 조절하게 되겠죠? 상대방이 아무리 슈퍼컴퓨터라고 해도 네트웤 상황이 안좋으면 빠르게 보내면 안되니까

udp는 아무것도 해주지 않아요

그래서 기존에 존재하는 이런 앱들이 어떤 서비스를 사용하는지 보면 거의 대부분 tcp를 사용하는데 가끔가다 udp를 사용하는데 그런건 중간에 유실되도 큰 문제 없는 것들 예를 들면 음성, 영상 통화 (동영상 스트리밍)