
지난 주(W05)는 동료학습을 통해 많은 것을 깨닳을 수 있었다.
- 함수형 프로그래밍의 장점을 '경험'했다. 원래 코드를 짜거나 남의 코드를 이해할 때 시간이 오래 걸려서 결국 진도가 느려지는 문제가 있었다. 그러다가 혜X님이 말씀해주신 말이 와닿았다. "혼자 다 하려고 하지 말고 '하청'주듯 함수를 이용하라"는 조언에 따라 함수의 기능(목적이라고도 해도 좋다)과 반환값 정도까지만 숙지하고 코드를 짜는 방법으로 코딩 시간을 비약적으로 단축시킬 수 있었다. (밤을 새지 않아도 됐당)
2일간 코드를 뜯어본 다음에 느낀 감상이라 이 방법의 효능에 대해서는 의구심이 아직 든다. 왜냐하면 함수에 대해 잘 알고 하는 것이 아니라, 함수의 작동 원리에 대해서는 모르는 채 "이거 쓰면 이렇게 나오겠지"라는 식으로 "퉁치듯" 코딩하는 방법이기 때문이다. 아직은 확신이 없지만 남들보다 진도가 느렸던 나에게는 큰 성과였다.
- 준X님이 코딩할 때 옆에서 지켜보며 느낀 바로, 너무 위축될 필요 없다는 것이다. 비록 틀리고 실제 작동하진 않더라도, 자신만만하게 코딩하면서 "쉽다 쉬워"라고 장난식으로 말하는 준X님의 모습을 보며 나도 코딩에 대해 "너무 어렵게 생각하지 말아야겠다"는 생각이 들었다. 적어도 말이라도 "쉽다 쉬워"는 말을 의도적으로 달고 살았다. 말이 씨가 될 수도 있으니까
- 세상은 나에게 가혹할지언정 나를 밀어내진 않는다. 지금까지 남들보다 진도가 느려서 혼자 공부하고 코딩하는 시간이 길었다. 그리고 진도가 빠른 사람들이 주류라고 생각했고, 그들이 함께 동료학습할 때 선뜻 함께하지 못했다. 그리고 그 간격은 쉽게 좁혀지지 않았다.
그러다 "잘하는 사람들만 모이라는 법이 있나?"라는 생각으로 진도가 느린 팀원과 함께 공부하고 같이 코딩을 시작했다. 그랬더니 다른 사람도 합류해서 세 명이 되었고, 세 명이 모이니 '진도가 빠른' 사람들도 관심을 갖고 함께 여럿이서 동료학습을 할 수 있었다. 이때 든 생각이 있다. 지금까지 내가 진도가 느리다는 이유로 동료학습을 안했고, 모두를 밀어내고 있었던 것이 아니었을까?
- "코드를 왜 이렇게 짠거지?"에 대한 질문을 던져라.
-> 어떻게 해야 나의 생각이 진보할 수 있을지에 대한 질문을 던져야 한다.- 우리는 엔지니어가 될 사람들이다.
-> 엔지니어란 제한된 자원(리소스)를 가지고 고객들에게 최대의 효능을 보여줘야 한다. 이를 필드(현장)에서 고민하는 사람들이 엔지니어이다.
-> 실습할 때 예제에서 주어지는 단편적인 생각뿐만 아니라, 메모리 내에서 블록이 100만개라면(혹은 1000만개라면?) 결국 속도, 접근성 등을 고려해야 있어야 한다.
-> 최종 프로젝트에서 교육용 프로그램을 만든다면, 회사를 가정해서 대표(CEO)가 개발자(교육생)에게 메모리의 효율을 증대시키라거나, 어떤 요구를 하는 상황을 가정해보자.- IP, Port, echo server, Proxy(대리인), 패딩(캐시), 소켓(가장 중요하다. 파일? 네트워킹?)
- echo 서버는 눈 감고도 코딩할 수 있어야 백엔드 개발자가 될 수 있다.

개방형 시스템 상호연결(OSI, Open Sysytem Interconnection)은 네트워크 스택의 다양한 계층이 결합되어 네트워크 통신을 가능케 하는 방법에 대한, 프로토콜에 구애받지 않는 설명을 제공하는 개념적 프레임워크입니다. 이 모델은 통신 시스템을 7개의 계층으로 나누며 각 계층은 다음 계층 위에 스택됩니다. OSI 모델의 각 계층은 특정 작업을 처리하고 그 위와 아래의 계층과 통신합니다.
한마디로, 방대한 네트워크 시스템을 개념적으로 계층화시킨 것입니다. 각 장치(소프트웨어)를 통신 시스템 내에서의 역할, 기능에 따라 OSI 모델의 계층에 매칭시켜 관리할 수 있습니다.
이 모델은
프로토콜을 기능별로 나눈 것입니다. 각 계층은 하위 계층의 기능만을 이용하고, 상위 계층에게 기능을 제공합니다.프로토콜 스택혹은스택은 이러한 계층들로 구성되는 프로토콜 시스템이 구현된 시스템인데, 프로토콜 스택은 하드웨어나 소프트웨어 혹은 둘의 혼합으로 구현될 수 있습니다.
출처 : 위키피디아
프로토콜이란?
통신 프로토콜또는통신 규약은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계입니다. 통신 프로토콜은 신호 체계, 인증, 오류 감지 및 수정 기능을 포함할 수 있습니다. 하드웨어나 소프트웨어, 때로는 모두를 사용하여 구현됩니다. 출처 : 위키피디아

사용자의 데이터와 직접 상호 작용하는 유일한 계층입니다.
응용 프로그램 계층은 소프트웨어가 사용자에게 의미 있는 데이터를 제공하기 위해 의존하는 프로토콜과 데이터를 조작하는 역할을 합니다. 웹 브라우저, 이메일 등은 통신하기 위해 이 계층에 의지합니다.
HTTP나 SMTP(이메일 통신 프로토콜)등이 여기에 속합니다.

프리젠테이션 계층은 응용 프로그램이 소비할 수 있도록 데이터를 준비하는 단계입니다. 데이터의 변환, 암호화, 압축을 담당합니다.
- 서로 통신하는 두 개의 장치는 서로 인코딩 방법이 다를 수 있으므로 수신 장치의 APP 계층이 이해할 수 있게 데이터를 변환합니다.
- 장치가 암호화된 연결을 통해 통신하는 경우, 송신자에게 암호화를 추가할 뿐만 아니라 최종 수신자에게 암호화를 디코딩하여 APP 계층에 전달합니다.
- APP 계층에서 수신한 데이터를 계층 5로 전송하기 전에 압축하여 통신 속도와 효율을 높입니다.

두 기기 사이의 통신의 시작과 끝을 담당하는 계층입니다.
세션이란 통신이 시작될 떄부터 끝날 때까지의 시간입니다.
교환되고 있는 모든 데이터를 전송할 수 있도록 세션을 개방하고, 교환이 끝난 뒤 리소스가 낭비되지 않도록 세션을 즉시 닫는 것을 보장합니다. 또한 데이터 전송을 체크포인터와 동기화합니다.
예를 들어, 100MB 파일이 전송되는 경우 세션 계층은 5MB 마다 체크포인트를 설정할 수 있습니다. 만일 52MB가 전송된 후 연결이 끊어진다면 마지막 체크포인트인 50MB에서 세션을 재개하면 됩니다.

계층 4는 두 기기 간의 종단 간 통신을 담당합니다. 세션 계층에서 가져온 데이터를
세그먼트라는 조각으로 분할하거나, 수신한 데이터를 세션 계층이 사용할 수 있도록 재조립합니다.
흐름 제어 및 오류 제어 기능의 역할도 합니다.
- 연결 속도가 빠른 송신자가 연결 속도가 느린 수신자를 압도하지 않도록 최적의 전송 속도를 결정합니다.
- 전송 계층은 수신된 데이터가 완료되었는지 확인하고 수신되지 않은 경우 재전송을 요청하여 최종 수신자에 대한 오류 제어를 수행합니다.
전송 제어 프로토콜(TCP, Transmission Control Protocol)/사용자 데이터 프로토콜(UDP, User Datagram Protocol)이 이 계층에 속합니다.

네트워크 계층은 서로 다른 두 네트워크 간 데이터 전송을 용이하게 합니다. 전송 계층의 세그먼트를 송신자의 장치에서 패킷이라고 불리는 더 작은 단위로 세분화하여 수신 장치에서 이 패킹을 다시 조립합니다.
또한 데이터가 표적에 도달하기 위한 최상의 물리적 경로를 찾는데, 이를라우팅이라고 합니다.
IP(Internet Protocol),인터넷 제어 메시지 프로토콜(ICMP) 등이 속합니다.

데이터 연결 계층은 동일한 네트워크에 있는 두 장치 간 데이터 전송을 용이하게 합니다. 네트워크 계층에서 패킷을 가져와서
프레임이라는 더 작은 조각으로 세분화합니다. 네트워크 계층과 마찬가지로 인트라 네트워크 통신에서 흐름 제어 및 오류 제어를 담당합니다.

이 계층에는 케이블, 스위치 등 데이터 전송과 관련된 물리적 장비가 포함됩니다. 이 계층은 1과 0의 문자열인 비트 스트림으로 변환되는 계층입니다. 두 장치의 물리적 계층은 신호 규칙에 의해서 1이 0과 구별될 수 있어야 합니다.

네트워크를 통해 사람이 읽을 수 있는 정보를 장치 간에 전송하려면, 데이터가 송신 장치에서 OSI 모델의 7가지 계층 아래로 이동한 다음 수신 장치에서 7가지 계층을 위로 이동해야 합니다.
예: 쿠퍼 씨가 파머 씨에게 이메일을 보내려고 합니다. 쿠퍼 씨는 자신의 노트북에 있는 이메일 애플리케이션에서 메시지를 작성하고 '발송'을 누릅니다.
1. 쿠퍼 씨의 이메일 애플리케이션이 이메일 메시지를 애플리케이션 계층으로 넘기면, 애플리케이션 레이어는 프로토콜(SMTP)을 선택하고 데이터를 프레젠테이션 계층으로 전달합니다.
2. 프리젠테이션 계층이 압축한 데이터는 세션 계층에 도달하고
3. 세션 계층은 세션을 시작합니다.
4. 데이터는 발신자의 전송 계층으로 넘어가 세그먼트로 나눠지게 되며
5. 이 세그먼트는 네트워크 계층에서 패킷으로 다시 나눠지고 6. 이는 데이터 연결 계층에서 프레임으로 나눠집니다. 데이터 링크 계층은 해당 프레임을 물리적 계층으로 전달하며
7. 물리적 계층은 데이터를 1과 0의 비트스트림으로 변환하고 물리적 매체(예: 케이블)를 통해 전송합니다.
파머 씨의 컴퓨터가 물리적 매체(예: 와이파이)를 통해 비트스트림을 수신하면, 데이터는 반대 순서로 계층을 지나게 됩니다.
7. 먼저 물리적 계층은 비트 스트림을 1과 0에서 프레임으로 변환해 데이터 연결 계층으로 넘깁니다.
6. 데이터 연결 계층은 프레임을 패킷으로 재조립해 네트워크 계층으로 넘깁니다.
5. 네트워크 계층은 패킷으로 세그먼트를 만들어 전송 계층으로 넘기고
4. 전송 계층은 세그먼트를 재조립해 하나의 데이터를 만듭니다.
3. 이제 데이터는 수신자의 세션 계층으로 흐르고
2. 세션 계층이 이 데이터를 프리젠테이션 계층으로 넘기면 통신 세션이 종료됩니다.
1. 이제 프레젠테이션 계층은 압축을 제거하고 원본 데이터를 애플리케이션 계층으로 넘깁니다. 애플리케이션 계층은 사람이 읽을 수 있는 데이터를 파머 씨의 이메일 소프트웨어에 제공합니다.
이러한 과정을 통해 파머 씨는 자기 노트북 화면에서 이메일 소프트웨어를 통해 쿠퍼 씨의 이메일을 읽을 수 있게 됩니다.
인터넷 프로토콜(IP)는 인터넷의 주소 체계로, 정보 패킷을 전달하는 것이 핵심 기능입니다. IP는 네트워크 연결이 이루어지는 기본적인 방법으로, 인터넷의 기반이 됩니다.
IP는 패킷 순서 지정 또는 오류 검사를 처리하지 않는데 이는 또 하나의 프로토콜인전송 제어 프로토콜(TCP)이 그 역할을 합니다.
TCP/IP의 관계는 퍼즐에 메시지를 작성하여 우편으로 보내는 것과 비슷합니다. 퍼즐에 작성한 메시지는 여러 조각으로 나뉩니다. IP는 각 조각이 목적지 주소에 도착하도록 합니다.
퍼즐의 조각들은 각각 다른 우편 경로를 통해 전달되고 조각마다 전달되는 시간이 다릅니다. 다른 경로를 통해 전달된 퍼즐의 조각들은 순서가 뒤죽박죽이 되어 있을 수 있습니다. TCP 프로토콜은 수신측에서 조각들을 올바른 순서로 맞추고, 누락된 조각을 발신측에 다시 보내달라고 요청하고 첫 조각부터 마지막 조각까지 발신자와의 접속을 유지합니다.
IP는 연결이 없는 프로토콜이므로 데이터의 각 단위는 개별적으로 주소가 지정되고 소스 장치로부터 대상 장치로 라우팅(최소 경로 지정)됩니다. 대상 장치는 이를 수신했다는 확인을 소스에 보내지 않습니다.
그러므로 TCP와 같은 프로토콜이 필요해집니다. TCP는 IP와 함께 사용해서 발신자와 대상 사이의 연결을 유지하며 패킷 순서를 보장합니다.

예를 들어, TCP를 통해 이메일을 전송하면 연결이 설정되고 3방향 핸드 셰이크가 만들어집니다.
1. 대화를 시작할 수 있도록 소스(발신)가SYN"최초 요청" 패킷을 대상 서버로 보냅니다.
2. 다음으로, 대상(수신) 서버가SYN_ACK패킷을 보내 이 과정에 동의합니다.
3. 소스가 대상에ACK패킷을 보내 이 과정을 확인하며, 이후 메시지 콘텐츠를 전송합니다.
이메일 메시지는 궁극적으로 패킷으로 보내지며, 인터넷에서는 일련의 게이트웨이를 통해 대상 장치에 도착하는데 이 패킷들이 다시 TCP에 의해 조립되어 이메일의 원래 메시지로 구성됩니다.

패킷(packet, pack+bucket)이란 패킷 방식의 컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록이다. 패킷은 제어 정보와 사용자 정보로 이루어지며, 이는페이로드라고도 한다. 데이터가 패킷으로 형식이 바뀔 때, 네트워크는 장문 메시지를 더 효과적이고 신뢰성 있게 보낼 수 있다. - Wikipedia
즉 컴퓨터 네트워크에서 데이터를 주고 받을 때 정해놓은 규칙입니다.
사용자가 이미지를 로드해야 한다고 가정해보겠습니다.
이미지 파일은 웹 서버에서 사용자의 컴퓨터로 단번에 전송되지 않습니다. 대신 데이터 패킷으로 분해되어 인터넷의 유선, 케이블, 전파 등을 통해 전송된 다음 사용자의 컴퓨터에서 원본 사진으로 재조립됩니다.
이론상, 파일과 데이터는 작은 정보 패킷으로 자르지 않고 인터넷을 통해 보낼 수 있습니다. 하나의 컴퓨터에서 끊어지지 않은 긴 비트 라인(컴퓨터가 해석할 수 있는 전기 펄스로 전달되는 작은 정보 단위)의 형태로 다른 컴퓨터로 보낼 수 있습니다.
그러나, 이러한 접근 방식은 두 대 이상의 컴퓨터가 관련된 경우 실용적이지 않게 됩니다. 긴 비트 줄이 두 컴퓨터 사이의 회선을 통과하는 동안 세 번째 컴퓨터에서는 동일한 회선을 사용하여 정보를 보낼 수 없습니다.

이는 큰 데이터는 대역폭(신호를 전송할 수 있는 주파수 범위 또는 폭)을 너무 많이 차지하기 때문입니다. 예를 들어 도로가 4차선인데 차가 2차선을 차지하고 있는 경우, 각 차선마다 차가 다니는 것보다 정체가 일어나기 쉽기 때문입니다.

인터넷은 "패킷 스위칭" 네트워크입니다.
패킷 스위칭은 네크워킹 장비가 서로 독립적으로 패킷을 차리하는 기능을 일컫습니다. 이는 또한 패킷이 모두 대상에 도착하는 한 동일한 대상에 대해 서로 다른 네크워크 경로를 사용할 수 있음을 의미합니다. (패킷은 각 패킷의 조각이 다른 경로를 통하더라도 올바른 순서로 최종 목적지에 도착해야 합니다.)
패킷 스위칭 덕분에 여러 컴퓨터의 패킷이 임의의 순서로 동일한 선로를 통해 이동할 수 있으며, 동일한 네트워킹 장비를 통해 동시에 여러 연결을 수행할 수 있습니다.
패킷 헤더는 패킷의 내용, 원본, 대상에 대한 정보를 제공하는 일종의 "레이블"입니다.

예를 들어 Alice가 일련의 색인 카드를 Bob에게 보낼 때 단어가 적힌 카드만으로는 Bob이 편지를 올바르게 받을 수 없습니다.
Alice는 Bob이 카드 조각을 순서대로 읽도록 색인 카드가 수신되는 순서를 표시해야 합니다.
또한 자신이 카드를 배달하는 동안 Bob이 다른 사람들로부터 메시지를 받는 경우를 대비하여 각 카드가 그녀에게 온 것임을 표시해야 합니다.
따라서 Alice는 첫 번째 카드 조각에 "Alice의 편지, 20개 중 첫 번째"등을 씁니다.
이처럼 패킷은
헤더와페이로드(Payload, 적재물(순수한 데이터))로 구성됩니다. 헤더에는 원본 및 대상의 IP 주소(Bob의 우편 주소)와 같은 패킷에 대한 정보가 포함되어 있습니다. 페이로드는 실제 데이터(편지)입니다.


Preamble: 패킷의 동기화 등을 위해 각 프레임의 헤더 맨 앞에 붙이는 영역으로, 패킷의 시작을 알림
DA: Destination address, 목적지의 MAC 주소
SA: Source address, 송신지의 MAC 주소
type: data에 들어 있는 type, Type의 종류에 따라 데이터를 몇 비트씩 잘라서 해석할지를 결정. 대표적인 Type은 IP
Data: 46 ~ 1500 byte의 상위 프로토콜 데이터 패킷(ip, tcp or udp). 즉 상위에 있는 레이어에 대한 프로토콜의 정보
FCS: 오류 검사 필드, 프레임에 있는 에러를 검출하기 위해CRC(Cyclic Redundancy Check, 순환 중복 검사)를 사용

Version: IP 버전 표시(IPv4 or IPv6)
Header Length: IP 패킷에서 헤더가 차지하는 길이
Type of Service: 서비스 타입 및 수준을 표시, 즉 패킷이 얼마나 빨리 처리/전달되어야 하는가
Total Length: 패킷의 전체 길이를 표시
Identification: 하나의 패킷이 여러 조각으로 분할된 경우 각 조각을 구분하기 위하여 부여하는 정보
Flags: 패킷 분할에 대한 컨트롤 정보(0: 분할가능 or1: 분할불가 /0: 마지막 조각,1: 이후 조각 더 있음)
Time To Live: 패킷이 인터넷에서 사용될 수 있는 시간을 표시
Protocol Type: 상위 계층의 프로토콜을 표시(TCP/UDP 등)
Header Checksum: 헤더에 대하여 에러 발생시 에러 정정을 위한 체크
Source Address: 발신자의 IP 주소
Destination Address: 수신자의 IP 주소
Option: 선택 사항

Source Port(16 bits) : 상위 App에 따른 값이 결정되며 송신지 포트 번호를 나타냄
Destination(16 bits) : 수신지 포트 번호
Sequence Number(23 bits) : 패킷의 송신 Data의 일련 번호
Acknowledgement Number(32 bits) : 수신 Data의 일련 번호(수신될 다음 바이트의 예상 일련번호)
Data offset(4 bits) : 패킷 내의 데이터 오프셋
Control(6 bits) : URG(긴급 포인터), ACK(승인), PSH(푸쉬), RST(접속의 리셋), SYN(동기화 일련번호), FIN(송신자로부터 더이상의 데이터 없음) 등
Windows(16 bits) : 메시지 전송시 흐름 제어
Checksum(16 bts) : 에러 Check
Urgent Position(16 bits) : TCP 긴급 포인터
Option(24 bits) : TCP 옵션들

네트워크 트래픽은 네트워크를 통과하는 패킷의 양을 나타내는 용어입니다. 자동차 트래픽(traffic, 이동량)이 도로 위의 자동차들을 나타내는 것과 같습니다.
만약 어떤 공격자가 네트워크를 손상시키거나 과부하시키도록 설계된 데이터 패킷을 사용해 악의적인 네트워크 트래픽을 생성할 수 있습니다. 이는분산 서비스 거부(DDoS, Distributed Denial of Service) 공격, 취약점 악용 등의 사이버 공격의 형태가 될 수 있습니다.