Transport Layer(전송 계층)은 End Point 간 신뢰성 있는 데이터 전송을 담당하는 계층입니다. 데이터를 순차적이고 안정적으로 전달해주며, 포트 번호에 해당하는 프로세스에 데이터를 전달합니다. 데이터의 순서를 보장하고, 송수신 과정에서 메모리 한계로 데이터가 누락되거나 통신 속도가 느려지는 것을 방지합니다.
전송 계층에서 대표적인 프로토콜이 TCP입니다. 이를 통해 신뢰성 있는 데이터 통신이 가능하게 해준다고 할 수 있습니다. 커넥션을 연결할 때, TCP 헤더 안에 있는 9개의 플래그 비트를 사용합니다.
flag, 플래그 : 프로그래밍에서 특정 동작을 수행할지 말지를 결정하는 1비트 변수를 의미합니다. true/false와 같이 2가지의 약속된 신호를 남기기 위해서 사용합니다.
TCP에서 커넥션 연결을 위해서 쓰리 웨이 핸드쉐이크라는 방식을 사용합니다. 그 동작 과정은 다음과 같습니다.
위 과정이 정상적으로 이루어졌다면, 커넥션 연결에 성공했고 클라이언트와 서버의 상태는 established로 변경됩니다.
TCP에서 커넥션 종료(connection close)를 위해서는 포 웨이 핸드쉐이크 방식을 사용합니다.
패킷 : packet(package + bucket)으로, 네트워크를 통해 전송하기 쉽도록 자른 데이터의 전송 단위이자 형식화된 블록입니다. 패킷은 제어 정보와 사용자 데이터로 이루어지는데, 이를 페이로드(payload)라고도 합니다. 패킷 형식으로 데이터를 보낼 때, 장문의 메시지를 더 효과적이고 신뢰성 있게 보낼 수 있다는 장점이 있습니다.
페이로드 : 데이터가 전송될 때, 데이터에는 헤더 정보와 실제 데이터를 모두 포함합니다. 헤더에는 패킷의 소스 및 대상을 식별하는 정보가 있고, 실제 데이터는 '페이로드'라고 합니다. 헤더 정보(오버헤드 데이터)는 전송 프로세스에서만 사용되기 때문에, 목적지에 도달하면 패킷으로부터 벗겨집니다.
자바스크립트 함수의 정의는 정적 스코프(static scope or lexical scope)를 채택하고 있습니다. 따라서 함수의 유효범위는 함수를 어디서 호출했느냐가 아니라, 어디서 정의했느냐에 따라 다르게 정해집니다. 정의를 단 한번만 하기 때문에 정해지고 바뀌지 않는 것입니다.
함수 내에서 또 다른 함수를 정의하면, 자식 함수에서 부모 함수가 가진 변수나 메소드를 참조하여 사용할 수 있습니다. 이를 클로저라고 합니다.
콜 스택은 여러 함수들을 호출하는 스크립트에서 해당 위치를 추적하는 인터프리터를 위한 메커니즘입니다. 가장 대표적인 인터프리터에는 웹 브라우저의 자바스크립트 인터프리터가 있습니다. 콜스택을 통해 현재 어떤 함수가 동작하고 있는지, 그 함수 내에서 또 어떤 함수가 동작하는지, 다음에는 어떤 함수가 호출되어야 하는지에 대해서 제어해줍니다.
동작 구성단계는 다음과 같습니다.
스코프는 현재 실행되는 컨텍스트를 의미합니다. 컨텍스트는 변수나 메소드와 같은 표현식을 같은 스코프 내에 있다면 참조해서 사용할 수 있습니다.
그리고 스코프는 계층적인 구조를 갖기 때문에 하위 스코프는 상위 스코프를 접근할 수 있지만, 반대로는 불가합니다.
부모 함수에 있는 변수와 메소드를 자식 함수가 참조할 수 있습니다. 이때 반드시 부모 함수 내부에 자식 함수가 정의되어 있어야 합니다.
전역 영역에 정의된 변수나 메소드는 최상위 요소이기 때문에, 어느 곳에서든 참조해서 사용할 수 있는 것입니다.
문자 그대로의 뜻은 '상황, 맥락, 문맥 상의 의미'를 갖고 있습니다. JavaScript에서의 컨텍스트는 실행에 필요한 다양한 정보를 형상화하고, 이들을 목록화 관리하기 위한 추상적인 개념입니다. 또한 다음과 같은 더 구체적인 정보들을 포함하고 있습니다.
위와 같은 정보를 객체 형태로 담아 스택(LIFO)으로 관리합니다. 자바스크립트 엔진은 코드를 읽어내려가며, 실행 가능한 코드를 만나면 코드를 평가해서 실행 컨텍스트를 만들어냅니다.
깊은 복사는 복사본을 만들 때 사용한 원본과 동일한 참조를 공유하지 않는 복사입니다. 따라서 원본을 수정해도 복사본은 영향을 받지 않고, 복사본을 수정해도 원본은 영향을 받지 않습니다.
반대로 얇은 복사는 원본 또는 복사본을 수정했을 때, 서로 영향을 받아 동일하게 수정됩니다. 이는 두 객체가 동일한 참조값을 갖기 때문입니다.
얉은 복사 : 수정 시 영향 받음
깊은 복사 : 수정 시 영향 안 받음
얇은 복사로 기존 배열 자체를 수정하는 메소드가 있고, 깊은 복사로 새로운 배열을 반환하여 기존 배열에 영향을 주지 않는 메소드가 있습니다. 이를 잘 구분하여 상황에 맞는 메소드를 사용할 필요가 있습니다.
패킷 교환 방식
호출 스택
Context 컨텍스트, 상황 (Context)
JavaScript에서 개체 복사
자바스크립트 중급 강좌 #7 - 배열 메소드1(Array methods)
르윈의 TCP UDP
http://wiki.hash.kr/index.php/%ED%8C%A8%ED%82%B7