데이터가 의도된 목적지에 닿을 수 있도록 보장해주는 통신규약
즉 IP는 데이터가 찾아갈 주소, TCP는 찾아온 데이터가 형식에 맞게 왔는지 확인하는 필터.
클라이언트로 부터 특정 주소로 요청이 들어오면 DNS상에서 IP주소를 받아온다 ⇒ HTTP 계층에서 HTTP메시지를 작성한다 ⇒ TCP계층에서 HTTP 메시지를 패킷으로 분해한다 ⇒ IP계층에서 전송 위치를 확인 ⇒ 네트워크를 통하여 전송한다 ⇒ 그 이후는 역순으로 진행하여 처리된다
좀 더 자세한 설명:
TCP는 UDP와 달리 연결지향적이다. 근데 UDP란 무엇일까?
UDP 데이터를 전송한다는 점에서 TCP와 비슷하지만 특성에 있어서 차이가 있는 프로토콜이다.
UDP는 비연결지향적이며 오류를 처리하거나 순서를 재조합시켜주는 기능을 가지고있지 않다. 단순히 데이터를 받거나 던져주기만 하는 프로토콜이다. 보통 실시간 멀티미디어 정보를 처리하기 위해서 사용한다.
TCP는 연결지향적이며 자체적으로 오류처리가 가능하고, 전송도중 순서가 뒤바뀐 메세지를 교정시켜주는 기능을 가지고 있다. 연결지향이라는 말은 데이터를 전송하는 측과 데이터를 전송받는 측에서 전용의 데이터 전송 선로(Session)을 만든다는 의미이다. 보통 데이터의 신뢰도가 중요하다고 판단될때 주로 사용된다.
연결지향에 대해 좀 더 자세히 설명하자면
데이터가 전송되기 전에 HostA는 hostB에게 "서버 잘 있나요?" 라는 check 메세지를 보내고, hostB는 "서버 준비 됐으니 데이터 보내세요" 라는 메세지를 보낸다. 즉 서로의 존재를 확인하는 절차를 수행한 후, 정식 데이터를 교환하기 위한 통신선로를 개설하게 된다. 이 과정에서 세번의 데이터 전송이 일어나게 되므로 three way handshake라고 부른다.
UDP는 이런 과정 없이 단순히 데이터만을 전송함으로 "데이터그램" 프로토콜이라고 부른다.
TCP 데이터 주고 받기
스트림 기반
보내기: 스트림에 write
받기: 스트림에서 read (nodejs 에서는 data 이벤트를 사용)
소켓 통신을 위한 기본 모듈: net
var net=require('net');
클래스:
net.Server: 소켓서버
net.Socket: 소켓
서버를 만들이위해선 net.Server
서버와 클라이언트가 연결되려면 소켓을 통해 데이터를 주고받는데, 나중에 데이터를 쓰고 읽기위한 코드들이 Socket에있음...뭔소리지
서버 생성:
var server = net.createServer([options][,connectionListener])
서버함수:
server.listen(); 얘가 제일 중요함 클라이언트 접속 대기
server.close() 추가 접속을 받지 않는다
server.getConnections(callback) 연결 갯수
server.address() 서버주소
서버이벤트:
listening: 포트 바인딩, 접속 가능한 상태 이벤트. server.listen메소드가 호출 되었을 경우
connection: 클라이언트 접속 이벤트
close: 서버 닫기(연결된 소켓이 없을 때만 발생)
error: 에러
서버 코드를 살펴보자:
var server=net.createServer(function(socket){
console.log('Connect Event',socket.remoteAddress);
});
server.on('listening',function(){
console.log("Server is Listening @",server.address();
});
server.on("close",function(){
console.log("Server Close");
});
var server=net.createServer(function(socket){ console.log('Connect Event',socket.remoteAddress); });
이 코드에서 socket은 클라이언트와 연결된 소켓을 의미한다.
클라이언트 코드를 살펴보자:
var socket=new net.Socket();
var option = {
host='localhost',
port=3000
};
socket.connect(option,function(){
});
net.Socket()으로 클라이언트 소켓을 생성하고, connect 함수를 사용하여 서버와 연결한다.
TCP는 연결지향이기에 연결하기위한 코드가 필요함.
서버쪽은 client와 연결하기위해 listen이라는 함수가 있다.
net.Socket 이벤트
connect: 원격 소켓 연결 이벤트
data: 읽을 수 있는 데이터 도착
end: 원격 호스트의 소켓 종료
timeout: 제한 시간 지남
error: 에러
net.Socket함수, 프로퍼티
connect(options[,connectListener]):연결
write(data[,encoding][,callback]:데이터 쓰기
end([data][,encoding]):연결 종료 신호 보내기
setKeepAlive([enable][,initialDelay]): 연결 유지
remoteAddress, remotePort: 원격 호스트 주소와 포트
net.Socket데이터 쓰기
socket.write("HelloNode.JS");
연결됐다는 가정 하에 write로 서버로 보냄. 서버쪽은 그럼 읽는게 되겠지? 아래 읽기를 보자
net.Socket 읽기
socket.on('data',function(chunk){
//데이터 도착
});
socket.on('end',function(){
//원격 호스트의 종료
});
chunk는 데이터이벤트를 통해 클라이언트로부터 받은 데이터다
소켓 서버
var server = net.createServer(function(socket){
socket.write('Welcome to Socket Server\n');
//클라이언트에서 write 하면 data 이벤트로 읽어옴
socket.on('data',function(data){
var textMsg=data.toString();
console.log('Client send: ', textMsg);
});
//접속 종료 이벤트
socket.on('end',function(){
//클라이언트와 접속 종료
});
});
server.listen(3000);
소켓 클라이언트
var socket= new net.Socket();
socket.connect({port: 3000, host:host},function(){
//서버에서 write 한거 data 이벤트로 받아옴
socket.on('data',function(data){
var str=data.toString();
console.log('>>',str);
});
socket.on('end',function(){});
//서버에 데이터 전송
socket.write('Hello Socket Server!\n');
socket.write('Bye Bye~');
//연결 종료
socket.end();
})
https://velog.io/@rosewwross/TCPIP
https://eastroot1590.tistory.com/entry/socket-TCPIP란
https://www.joinc.co.kr/w/Site/Network_Programing/Documents/IntroTCPIP
https://qmffor09.tistory.com/6
https://www.youtube.com/watch?v=Sio5Qc-zp-w
https://www.mattzeunert.com/2018/10/25/manually-making-an-http-request-with-nodejs.html
잘 읽었습니다~!